6 Stimmen

Was ist der Anfangswert der Eigenschaft "Prototyp" einer JavaScript-Funktion?

Ich weiß, dass die prototype Eigenschaft von JavaScript-Funktionsobjekten wird in die interne [[Prototype]] Eigenschaft (auch bekannt als __proto__ ) von Objekten, die durch Verwendung der Funktion als Konstruktor instanziiert werden. Ich kann diese Eigenschaft also auf ein beliebiges Objekt setzen, das als Prototyp fungieren soll:

function Foo() {}
Foo.prototype = {
  toString: function() { return "I'm a Foo!"; }
}
new Foo().toString()
// --> "I'm a Foo!"

Es scheint eine weit verbreitete Praxis zu sein, Funktionen, die als Klassenmethoden fungieren sollen, der bestehende Prototyp von neu erzeugten Funktionen wie dieser:

function Bar() {}
Bar.prototype.toString = function() {
  return "I'm a Bar!";
}
new Bar().toString()
// --> "I'm a Bar!"

Es ist mir allerdings unklar, was die Anfangswert der prototype Eigenschaft ist.

function Baz() {}
Baz.prototype
// --> Baz {
//       constructor: function Baz() {},
//       __proto__: Object
//     }

Der Kommentar zeigt, was die JavaScript-Konsole von Chrome ausgibt. Heißt das, dass jede Funktion, die ich erstelle, tatsächlich eine dos Objekte? Eines für die Funktion selbst (das constructor ) und eine für seinen Prototyp?

Ist dies irgendwo in der ECMAScript-Norm definiert? Ich habe versucht, es zu finden, konnte es aber nicht. Behandeln alle Browser dies auf dieselbe Weise?

10voto

bobince Punkte 512550

Der Anfangswert von prototype auf jede neu erstellte Function Instanz ist eine neue Instanz von Object aber mit der eigenen Eigenschaft constructor gesetzt, um auf die neue Funktion zu verweisen.

Dies wird in typischer ECMAScript-spec-untauglicher Weise von ECMA262-5 in Abschnitt 13.2 beschrieben:

(16.) Lassen proto das Ergebnis der Erstellung eines neuen Objekts sein, wie es durch den Ausdruck new Object() donde Object ist der eingebaute Standardkonstruktor mit diesem Namen

(17.) Rufen Sie die interne Methode [[DefineOwnProperty]] von proto mit Argumenten "constructor", Property Descriptor {[[Wert]]: F, {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}, und false.

(18.) Aufruf der internen Methode [[DefineOwnProperty]] von F mit den Argumenten "prototype", Property Descriptor {[[Value]]: proto , { [[Beschreibbar]]: wahr, [[Aufzählbar]]: falsch, [[Konfigurierbar]]: falsch}, und falsch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X