9
Object.defineProperty(Number.prototype, 'foo', { 
    get: function() { return this } 
}) 

console.log(10.5.foo) 
console.log(10..foo) // 0 in IE9! 
console.log(10.0.foo) // 0 in IE9! 
console.log(10.01.foo) 
console.log((10).foo) // 0 in IE9! 
var x = 10 
console.log(x.foo)  // 0 in IE9! 

誰もこの動作を説明したり、回避策を提案することはできますか?数値リテラルから `Number.prototype`のプロパティにアクセスする際に、IE9で奇妙な「ゲッタ」動作が発生する

jsfiddle.net/yr7hQ/

+1

好奇心の邪魔をして、なぜ地球上で*これをやりたいのですか? –

+3

'new Number(10)'で動作します - プリミティブとしての整数でのみ失敗します。うまく見つかりました! – pimvdb

+0

IE9のバグのように思えるのですが、根本的な理由が不思議です。あなたがしていることをより良くする方法があるはずです。 –

答えて

2

私はその結果を説明することはできませんが、また、回避策を求めました。

デモ:http://jsfiddle.net/ThinkingStiff/FJ7Qx/

スクリプト:

Number.prototype.foo = function() { return Number(this) }; 

console.log(10.5.foo()) 
console.log(10..foo()) 
console.log(10.0.foo()) 
console.log(10.01.foo()) 
console.log((10).foo()) 
var x = 10 
console.log(x.foo()) 
+0

優秀!私は今これを試して考えていない自分自身を蹴っている。 – davidchambers

+1

私は飛行機から降りた直後にコードを読んではいけません。一見すると、 'foo'はプロパティではなく、ここのメソッドであることに気付かなかった。これは確かに選択肢ですが、私はAPIを変更する必要がない回避策を発見したいと考えています。 – davidchambers

+0

@davidchambers: "メソッド"は、ちょうど関数タイプ –

1

APIをsullying回避するために、1はIE9を収容しなければならない状況でヘルパー関数を定義することができます。

function _(n) { return new Number(n) } 

これができます。

_(10).foo 

もっと良い回避策を知りたいです。

関連する問題