Ich habe Frage, vielleicht ein bisschen ungewöhnlich, über den Prototyp einer Funktion, diesen Code sehen und die Kommentare beachten, die die Ausgabe der Konsole:Verständnis Funktionsprototyp und __proto__
function Foo() {
};
var o = Foo.prototype;
console.log(o.__proto__); // Object {}
console.log(o.constructor); // function Foo() {}
console.log(o.__proto__.constructor); // function Object() { [native code] }
console.log(o.__proto__.constructor === o.constructor); // false
Bitte ignoriere, dass ich __proto__
anstelle des Standards getPrototypeOf()
verwende.
Ich versuche herauszufinden, warum die letzte Zeile false
ausdruckt. Wir wissen in der Regel, dass für jedes Objekt die folgenden Punkte zutrifft:
obj.__proto__.constructor === obj.constructor
Wir freuen uns, zu verstehen, warum dies nicht im Falle von o
oben ist als o
ist ein zu Objekt.
Ich frage mich, wenn es falsch ist, weil o
eigentlich ein Prototyp Instanz Funktion ist (Foo.prototype
), und daher wird es o.constructor
Set Foo
während Foo
Setup.
Ich weiß, dass dies nicht viel praktischen Nutzen haben kann, aber es ist nützlich, einige Dinge zu verstehen.
"* Wir wissen normalerweise, dass für jedes Objekt das Folgende zutrifft:' obj .__ proto __. Constructor === obj.constructor' * "- jedes Objekt ohne eigene' .constructor'-Eigenschaft, das heißt. Und 'Foo.prototype' * hat * eine eigene 'Konstruktor'-Eigenschaft, die auf' Foo' zeigt. – Bergi
@Bergi jedes Objekt hat eine "Konstruktor" -Eigenschaft, denke ich. Es ist von "Object.prototype" geerbt, das die "constructor" -Eigenschaft hat. Nicht sicher, was du meintest, wenn du bitte ein bisschen ins Detail gehst, wäre das nützlich, danke. –
Ich meinte eigene Eigenschaften, keine geerbten. Und Sie können sogar Objekte erzeugen, die nicht von "Object.prototype" abstammen, so dass sie überhaupt keine ".constructor" -Eigenschaft hätten (zB "" constructor "in Object.create (null)' ist false) – Bergi