2012-12-12 13 views
5

Im aktuellen Entwurf von Ecmascript 6 (November 2012) gibt es offizielle Unterstützung für die Eigenschaft __proto__ (Abschnitt B.3.1). Dies war überraschend, da in aktuellen Browserimplementierungen die Eigenschaft __proto__ nicht mehr unterstützt wird.Unterstützt Ecmascript 6 eine veränderbare Eigenschaft __proto__?

Wenn der aktuelle Entwurf steht, wird ES6 volle Unterstützung für veränderbare Prototypen haben? Kann ich einen neuen Prototyp für ein vorhandenes Objekt bereitstellen, so wie ich es derzeit in Firefox kann?

+0

Die '__proto__' Eigenschaft wird als "veraltet", denn es ist keine Standardeigenschaft statt' Object.getPrototypeOf (someobject); 'bevorzugt werden (ECMA5 std, also X -Browser-Unterstützung). Abgesehen davon ist es nicht gerade neu, einen Prototypen spontan zu ändern: Ich habe es in Chrome und IE probiert und den Prototypen eines benutzerdefinierten Objekts in 'neues Array' geändert, ohne irgendwelche Probleme ... es ist nur dem Prototyp innewohnend Modell –

+0

@Elias. Object.getPrototypeOf() ist eine Funktion von Ecmascript 5, da _ _proto _ _ niemals Teil des Ecmascript-Standards war. Es scheint, dass _ _ proto _ _ zuerst aus dem Browser veraltet und dann (zum ersten Mal) in den Standard eingeführt wurde. Obwohl diese Reihenfolge der Ereignisse ungewöhnlich erscheint, scheint dies der Fall zu sein. Ich frage speziell nach dem "neuen" _ _ proto _ _ in Ecmascript 6 - B.3.1. - –

+0

Ich bin mir nicht sicher, was Sie fragen. Es ist im aktuellen Entwurf, also ja, es sieht so aus, als ob wir das haben. Auf der anderen Seite ist es immer noch ein Entwurf, also kann sich alles ändern. – bfavaretto

Antwort

8

Momentan ist es für veränderbare __proto__ geplant, in der Spezifikation zu sein (und nicht nur in Anhang b). Der aktuelle Plan ist, dass es sich um eine magische Dateneigenschaft handelt, die nur auf Object.prototype existiert und als Accessor (der magische Teil) fungiert. Diese Eigenschaft ist ebenfalls löschbar und entfernt die Möglichkeit, __proto__ für diesen Bereich zu ändern, wenn sie gelöscht wird. Ich habe __proto__ nach dieser Beschreibung in meiner virtuellen Maschine ES6 http://benvie.github.com/continuum implementiert.

Ursprünglich sollte es veraltet und ersetzt werden, aber kein Konsens über diesen Ersatz gebildet wurde. Die Fähigkeit, von Butintins zu erben, ist das Endziel und die Entscheidung war, dass __proto__ bereits weit verbreitet ist (alles außer ie hat es) und erfüllt dieses Ziel, so dass der Weg des geringsten Widerstands darin bestand, es zu umfassen und zu kodifizieren.

+1

ist gerade dabei und, Wow, es ist verrückt! – Ven

+1

Diese Antwort scheint veraltet zu sein. Es sieht so aus, als ob sich der Konsens für die Ersetzung ("Reflect.setPrototypeOf") gebildet hat, und "__proto__" befindet sich immer noch im Web-Legacy-Anhang B; ohne Pläne, es zu bewegen. – Bergi

+0

Laut http://webreflex.blogspot.com/2013/05/objectsetprototypeofo-proto-is-in-es6.html ist der offizielle Weg dazu in ES6 "Object.setPrototypeOf" –

1

Wie pro ECMAScript 6 freigegeben docs, existiert __proto__ noch aber als Bergi und MattBrowne in der obigen Lösung zeigte, wir Object.setPrototypeOf, die die modifed Version von __proto__ ist verwenden können.

Wenn die setPrototypeOf Funktion mit Argumenten O und Proto, die folgenden Schritte unternommen werden, aufgerufen wird:

  • Sei O RequireObjectCoercible (O).
  • ReturnIfAbrupt (O).
  • Wenn Type (Proto) weder Object noch Null ist, wird eine TypeError-Ausnahme ausgelöst.
  • Wenn der Typ (O) kein Objekt ist, geben Sie 0 zurück.
  • Lassen Sie den Status O. [SetPrototypeOf].
  • ReturnIfAbrupt (Status).
  • Wenn der Status false ist, eine TypeError-Ausnahme auslösen.
  • Return O.