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! 

Qualcuno può spiegare questo comportamento e/o suggerire una soluzione alternativa?Strano comportamento "getter" in IE9 quando si accede alla proprietà di `Number.prototype` da un numero letterale

jsfiddle.net/yr7hQ/

+1

Solo per curiosità, perché mai vorresti * fare questo? –

+3

Funziona con 'new Number (10)' - fallisce solo con gli interi come primitive. Ben trovato! – pimvdb

+0

Sembra quasi un baco IE9, ma sono curioso di sapere il motivo alla base .. Ci deve essere un modo migliore di fare ciò che stai cercando .. –

risposta

2

non riesco a spiegare questo risultato, ma anche chiesto una soluzione alternativa.

Demo: http://jsfiddle.net/ThinkingStiff/FJ7Qx/

Script:

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

Eccellente! Ora mi sto prendendo a calci per non aver pensato di provare questo. – davidchambers

+1

Oops. Non dovrei leggere il codice subito dopo essere sceso da un aereo. A prima vista non ho notato che 'foo' è un metodo qui, piuttosto che una proprietà. Questa è certamente un'opzione, ma spero di scoprire una soluzione alternativa che non richieda la modifica dell'API. – davidchambers

+0

@davidchambers: "metodi" sono solo proprietà che hanno funzione tipo –

1

Per evitare deturpando l'API, si potrebbe definire una funzione di supporto in contesti in cui IE9 deve essere alloggiati:

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

Questo permette:

_(10).foo 

Mi piacerebbe imparare una soluzione migliore.

Problemi correlati