Object.defineProperty in ES5?
-
26-09-2019 - |
Domanda
sto vedendo post su un 'nuovo' Object.create che rende l'enumerazione configurabile. Tuttavia, si basa su un metodo Object.defineProperty. Non riesco a trovare un'implementazione cross browser per questo metodo.
Stiamo scrivendo bloccato per il vecchio Object.create? Posso cose non scrivere che non funziona in IE6 / 7.
Soluzione
Ci sono diverse cose che non si può emulare dal metodo Object.create
ECMAScript 5 su un ambiente ECMAScript 3.
Come si è visto, l'argomento proprietà vi darà problemi dal momento che in implementazioni E3-based v'è alcun modo per modificare gli attributi di proprietà.
Procedimento Object.defineProperty
il @Raynos accennato, funziona su IE8, ma parzialmente , può essere utilizzato solo in elementi DOM.
Anche di accesso proprietà vi darà problemi, potrebbe essere imitato con i metodi non standard ampiamente supportati come __defineGetter__
/ __defineSetter__
, ma ancora una volta, è non può modificare la proprietà attributi .
Un altro problema da parte i descrittori di proprietà, è che il metodo Object.create
può accettare null
come argomento, per creare un oggetto che non eredita da qualsiasi cosa.
Questo non può essere emulato con la di Crockford Object.create
spessore , perché quando l'operatore è new
utilizzato con una funzione di costruzione che ha una proprietà prototype
contenente null
-o qualsiasi altra a valore non-oggetto, l'oggetto appena creato eredita da Object.prototype
comunque per default.
In alcune implementazioni -V8, Spidermonkey, Rhino, ecc ...- hanno un setteable __proto__
proprietà che potrebbe essere utilizzato per impostare un null
[[Prototype]], ma ancora una volta, che è non-standard, e di sicuro non potrà mai funzionare su IE.
I consiglierei, se si vuole indirizzare vecchi browser a non utilizzare queste caratteristiche, poiché non v'è alcun modo per farli funzionare correttamente su quegli ambienti.
Se si desidera continuare a utilizzare Object.create
, senza utilizzare i proprietà argomento, si potrebbe, tuttavia mi sento di raccomandare di rilevare le cose che non possono essere emulate.
Di seguito sarebbe un sicuro versione del di Crockford Object.create
spessore :
if (typeof Object.create != 'function') {
(function () {
var F = function () {};
Object.create = function (o) {
if (arguments.length > 1) { throw Error('Second argument not supported');}
if (o === null) { throw Error('Cannot set a null [[Prototype]]');}
if (typeof o != 'object') { throw TypeError('Argument must be an object');}
F.prototype = o;
return new F;
};
})();
}
In ogni caso, usare con cautela.
Altri suggerimenti
Se volete un buon implementazione defineProperty (), date un'occhiata alla https://github.com/ kriskowal / ES5-shim
Purtroppo, non è possibile fare l'enumerazione configurabile in un ambiente ES3. Questo spessore vi permetterà di chiamare l'API in entrambi gli ambienti, ma le proprietà sarà ancora enumerabile sotto ES3.
Per quel che vale,
Object.defineProperty funziona in IE8 e FF4.
Questo significa che la sua pena di funzione Sniff e implementarlo in cui è utile vedere come sperate l'aggiornamento da vale a dire 6/7 a 8/9 si verificherà nei prossimi anni.
Un'altra cosa a diffidare di è che la proprietà dontEnum ha un bug in JScript
Si dovrà lavorare tutto il modo in cui si utilizza la proprietà dontEnum in IE.
[Modifica]:
Ecco la documentazione per Internet Explorer e un collegamento alla ES5 specifica (Pagina 122 , 15.2.3.6)