2012-12-12 19 views
5

Nell'attuale bozza di Ecmascript 6 (novembre 2012), esiste il supporto ufficiale per la proprietà __proto__ (Sezione B.3.1). Questa è stata una sorpresa, poiché nelle attuali implementazioni del browser la proprietà __proto__ è deprecata.Ecmascript 6 supporta una proprietà __proto__ mutabile?

Se la bozza attuale è valida, ES6 avrà pieno supporto per i prototipi mutabili? Sarò in grado di fornire un nuovo prototipo per un oggetto esistente come faccio attualmente in Firefox?

+0

La proprietà '__proto__' è "obsoleto", perché non è una proprietà standard, invece' Object.getPrototypeOf (someObject); 'è da preferirsi (std ECMA5, così X supporto per i browser). Oltre a questo, cambiare un prototipo al volo non è esattamente nuovo: l'ho provato in chrome e IE, cambiando il prototipo di un oggetto personalizzato in 'nuovo array ', senza problemi ... è solo inerente al prototipo modello –

+0

@Elias. Object.getPrototypeOf() è una funzione di Ecmascript 5 come _ _ proto _ _ non è mai stata parte dello standard Ecmascript. Sembra che _ _proto _ _ sia stato prima ritirato dal browser e quindi introdotto (per la prima volta) nello standard. Sebbene questo ordine di eventi appaia insolito, sembra che questo sia il caso. Sto chiedendo in particolare il "nuovo" _ _proto _ _ in Ecmascript 6 - B.3.1. - –

+0

Non sono sicuro di cosa stai chiedendo. È nella bozza attuale, quindi sì, sembra che avremo quello. D'altra parte, è ancora una bozza, quindi tutto può cambiare. – bfavaretto

risposta

8

Attualmente, è previsto che il mutabile __proto__ sia nella specifica (e non solo nell'annesso b). Il piano attuale è che si tratti di una proprietà di dati magici che esiste solo su Object.prototype e che funge da accessor (la parte magica). Anche questa proprietà sarà eliminabile, rimuovendo la possibilità di mutare __proto__ per quel dominio quando cancellato. Ho implementato __proto__ seguendo questa descrizione nella mia macchina virtuale ES6 http://benvie.github.com/continuum.

Originariamente doveva essere deprecato e sostituito, ma non era stato raggiunto un consenso su tale sostituzione. La possibilità di ereditare da builtin è l'obiettivo finale e la decisione è stata che __proto__ è già diffuso (tutto tranne che ce l'ha) e soddisfa questo obiettivo, quindi il percorso di minor resistenza era quello di abbracciarlo e codificarlo.

+1

è appena arrivato e, per fortuna, è folle! – Ven

+1

Questa risposta sembra non essere aggiornata. Sembra che si sia formato il consenso per la sostituzione ('Reflect.setPrototypeOf'), e' __proto__' è ancora nell'annesso B legacy web; senza piani per spostarlo. – Bergi

+0

Secondo http://webreflection.blogspot.com/2013/05/objectsetprototypeofo-proto-is-in-es6.html, il modo ufficiale per farlo in ES6 sarà 'Object.setPrototypeOf' –

1

Secondo documenti EcmaScript 6 chiarificati, __proto__ esiste ancora ma come Bergi e MattBrowne rilevato nella soluzione di cui sopra, si può usare Object.setPrototypeOf che è la versione modificata del __proto__.

Quando la funzione setPrototypeOf viene chiamata con argomenti O e proto, sono adottate le seguenti fasi:

  • Let O Sia RequireObjectCoercible (O).
  • ReturnIfAbrupt (O).
  • Se Type (proto) non è né Object né Null, genera un'eccezione TypeError.
  • Se Type (O) non è Object, restituisce O.
  • Lascia lo stato O. [SetPrototypeOf].
  • ReturnIfAbrupt (stato).
  • Se lo stato è falso, genera un'eccezione TypeError.
  • ritorno O.
Problemi correlati