2016-06-20 7 views
7

den folgenden Code in die Sie inherits FunktionWarum verwendet Babel setProtoTypeOf für die Vererbung, wenn es bereits Object.create (superClass.prototype) verwendet?

mir erhalten diese babel REPL

class Test { 

} 

class Test2 extends Test { 

} 

Veröffentlichung

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; 
} 

Es sah gut, bis ich es tat sowohl Object.create auf dem Prototyp und ein setPrototypeOf Anruf realisiert . Ich war nicht so vertraut mit setProtoTypeOf so dass ich auf die MDN ging, wo es heißt:

Wenn Sie über die Leistung kümmern sollten Sie die [[Prototyp]] eines Objekts Einstellung vermeiden. Erstellen Sie stattdessen mit Object.create() ein neues Objekt mit dem gewünschten [[Prototyp]].

Das ist verwirrend für mich, da sie beide verwenden. Warum ist das der Fall?

Sollte stattdessen die Linie

if (superClass && !superClass.prototype) 

für sein, wenn der Prototyp nicht gesetzt ist, aber es hat noch einen __proto__?

Antwort

8

The setPrototypeOf hat den [[Prototyp]] von subClass von ihm Function.prototype zu superClass ursprünglichem Wert ist, es erbt statische Eigenschaften von ihm zu lassen.

Object.create kann hier nicht verwendet werden (wie für das Objekt .prototype), da es nicht erlaubt, Funktionen zu erstellen. Der Konstruktor einer Klasse muss natürlich eine Funktion sein; und die einzige Möglichkeit, dies zu tun, besteht darin, Funktionen unter Verwendung von Standardausdrücken/-deklarationen zu erstellen und anschließend seinen Prototyp zu ändern.

+0

Hmmm das ist ein bisschen verwirrend für mich. Könnten Sie ein Codebeispiel für die Unzulänglichkeiten von 'Object.create()' erstellen? Von dem, was ich in [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create) gelesen habe, erbt es statische Methoden, da es sich nur um Methoden handelt, die definiert sind der Prototyp der ursprünglichen Klasse richtig? – m0meni

+1

@ AR7: Statische Methoden sind im Konstruktorfunktionsobjekt der Klasse definiert, nicht im '.prototype' Objekt. Wir sprechen hier über die Erbauer, die sich gegenseitig erben, nicht die Prototypkette von Instanzen. – Bergi

+0

Oh, mit statisch meintest du [this] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static). Mit 'Object.create' können Sie also die Prototypmethoden erben, aber nicht Methoden, die mit dem Schlüsselwort' static' definiert wurden, richtig? Obwohl ich neugierig bin ... warum sind statische Methoden auf dem '__proto__' Objekt anstatt des Prototyps gespeichert? – m0meni

Verwandte Themen