2012-12-12 14 views
5

W aktualnym projekcie Ecmascript 6 (listopad 2012 r.) Dostępne jest oficjalne wsparcie dla nieruchomości __proto__ (sekcja B.3.1). Było to trochę zaskakujące, ponieważ w obecnych implementacjach przeglądarki właściwość __proto__ jest przestarzała.Czy Ecmascript 6 obsługuje zmienną właściwość __proto__?

Jeśli aktualny projekt będzie gotowy, czy ES6 będzie w pełni wspierać prototypy zmienne? Czy będę w stanie dostarczyć nowy prototyp dla istniejącego obiektu w sposób, w jaki obecnie mogę w Firefoksie?

+0

'właściwość __proto__' się "przestarzała", ponieważ nie jest to standardowy właściwość zamiast' Object.getPrototypeOf (someObject) 'to być korzystne (STD ECMA5, co X wsparcie dla przeglądarki). Poza tym zmiana prototypu w locie nie jest zupełnie nowa: próbowałem go w chrome i IE, zmieniając prototyp niestandardowego obiektu na 'nowy Array', bez żadnych problemów ... jest to nieodłączne dla prototypu model –

+0

@ Elias. Object.getPrototypeOf() jest funkcją Ecmascript 5, ponieważ _ _ proto _ _ nigdy nie było częścią standardu Ecmascript. Wygląda na to, że _ _ proto _ _ został najpierw wycofany z przeglądarki, a następnie wprowadzony (po raz pierwszy) do standardu. Chociaż ta kolejność zdarzeń wydaje się niezwykła, wydaje się, że tak jest. Pytam konkretnie o "nowe" _ _ proto _ _ w Ecmascript 6 - B.3.1. - –

+0

Nie jestem pewien, o co pytasz. Jest w aktualnym projekcie, więc tak, wygląda na to, że będziemy mieli. Z drugiej strony wciąż jest to szkic, więc wszystko może się zmienić. – bfavaretto

Odpowiedz

8

Obecnie jest planowane, aby zmienna __proto__ znajdowała się w specyfikacji (a nie tylko w załączniku b). Obecny plan zakłada, że ​​jest to magiczna właściwość danych istniejąca wyłącznie na Object.prototype i działająca jako accessor (magiczna część). Ta właściwość również zostanie usunięta, usuwając zdolność do mutowania __proto__ dla tej dziedziny po usunięciu. Zaimplementowałem __proto__ zgodnie z tym opisem w mojej wirtualnej maszynie ES6 http://benvie.github.com/continuum.

Pierwotnie miał być przestarzały i zastąpiony, ale nie powstał konsensus w sprawie tego zastąpienia. Zdolność do dziedziczenia z wbudowanych jest celem końcowym i decyzja była taka, że ​​__proto__ jest już rozpowszechniony (wszystko, ale to znaczy ma) i spełnia ten cel, więc ścieżką najmniejszego oporu było objęcie go i skodyfikowanie.

+1

właśnie to dostałem i, kurwa, to szalone! – Ven

+1

Ta odpowiedź wydaje się być nieaktualna. Wygląda na to, że konsensus dla zamiennika ('Reflect.setPrototypeOf') uformował się, a' __proto__' nadal znajduje się w dodatku B do starszej wersji sieci; bez planów przeniesienia. – Bergi

+0

Zgodnie z http://webreflection.blogspot.com/2013/05/objectsetprototypeofo-proto-is-in-es6.html, oficjalnym sposobem wykonania tego w ES6 będzie "Object.setPrototypeOf" –

1

Zgodnie ECMAScript 6 uwolnionych docs, __proto__ nadal istnieje, ale jako Bergi i MattBrowne wskazał w powyższym roztworze, możemy użyć Object.setPrototypeOf który poprawionego wersja __proto__.

Gdy funkcja jest wywoływana z setPrototypeOf argumenty O i proto, następujące kroki są podejmowane:

  • Niech Õ RequireObjectCoercible (O).
  • ReturnIfAbrupt (O).
  • Jeśli Typ (proto) nie jest ani obiektem, ani wartością Null, należy podać wyjątek TypeError.
  • Jeśli Typ (O) nie jest obiektem, zwróć O.
  • Ustaw status jako O. [SetPrototypeOf].
  • ReturnIfAbrupt (status).
  • Jeśli status jest fałszywy, wyrzuć wyjątek TypeError.
  • powrotu O.
Powiązane problemy