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__
?
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
@ 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
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