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.

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top