2016-06-20 7 views
7

zamieszczaniu następujący kod do babel REPLDlaczego babel używa setProtoTypeOf do dziedziczenia, gdy już działa Object.create (superClass.prototype)?

class Test { 

} 

class Test2 extends Test { 

} 

masz ten inherits funkcję

function _inherits(subClass, superClass) { 
    if (typeof superClass !== "function" && superClass !== null) { 
    throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); 
    } 
    subClass.prototype = Object.create(superClass && superClass.prototype, { 
    constructor: { 
     value: subClass, 
     enumerable: false, 
     writable: true, 
     configurable: true 
    } 
    }); 
    if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; 
} 

To wyglądało w porządku dla mnie, aż zdałem sobie sprawę, że robił zarówno Object.create na prototypie isetPrototypeOf połączeń . I nie było to, że znają setProtoTypeOf więc poszedłem do MDN gdzie mówi:

Jeśli zależy Ci na wydajności należy unikać ustawiania [[Prototype]] obiektu. Zamiast tego utwórz nowy obiekt z pożądanym [[Prototyp]] przy użyciu Object.create().

Co jest mylące dla mnie, ponieważ używają obu. Dlaczego tak jest?

Jeżeli linia zamiast być

if (superClass && !superClass.prototype) 

, gdy prototyp jest wyłączony, ale wciąż ma __proto__?

Odpowiedz

8

The setPrototypeOf ma ustawienie [[prototyp]] o subClass z jego wartość oryginalna Function.prototype do superClass, aby dziedziczyć właściwości statycznych od niego.

Object.create nie może być tutaj użyty (jak dla obiektu .prototype), ponieważ nie pozwala na tworzenie funkcji. Oczywiście konstruktor klasy musi być funkcją; Jedynym sposobem na to jest stworzenie funkcji za pomocą standardowych wyrażeń/deklaracji, a następnie zmiana ich prototypu.

+0

Hmmm to dla mnie trochę zamieszanie. Czy możesz utworzyć przykład kodu niedociągnięć 'Object.create()'? Z tego, co przeczytałem w [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create), odziedziczą statyczne metody, ponieważ są to tylko metody zdefiniowane w prototyp oryginalnego prawa klasowego? – m0meni

+1

@ AR7: Metody statyczne są zdefiniowane w obiekcie funkcji konstruktora klasy, a nie w obiekcie '.prototype'. Mówimy tu o konstruktorach dziedziczących tutaj, a nie o prototypowym łańcuchu instancji. – Bergi

+0

A więc statyczne oznaczało [to] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static). Więc 'Object.create' pozwala dziedziczyć prototypowe metody, ale nie metody zdefiniowane za pomocą słowa kluczowego' static', prawda? Chociaż jestem ciekawy ... dlaczego statyczne metody są przechowywane w obiekcie '__proto__' zamiast w prototypie? – m0meni

Powiązane problemy