ähnlich wie ein class Foo
selbst nicht vom gleichen Typ wie ein new Foo
, gibt es keinen Grund für Foo
alle Eigenschaften haben Sie Foo.prototype
zuweisen. Die Gründe dafür sind ein wenig anders, aber in einer anderen Sprache wie Java betrachten und es ist offensichtlich, dass das, was Sie versuchen, genau das zu tun nicht funktionieren soll:
class Foo {
public String bar = "analogous to Foo.prototype.bar which is a property of Foo instances";
}
class Baz {
String thisMethodShouldAndWillFail() {
return Foo.bar;
}
String thisIsWhatShouldAndWillWork() {
return (new Foo()).bar;
}
}
In Javascript, müssen Sie Ihre Vorstellung davon, was ein korrigieren Prototyp ist und wie es sich auf Objekte und Konstrukteure bezieht, oder Sie werden ständig auf Probleme stoßen. A foo
hat einen Prototyp, aber dieser Prototyp ist nichtfoo.prototype
. Es gibt keine Eigenschaft von foo
selbst, das ist sein Prototyp. Der Prototyp des foo
wird durch seinen ErbauerFoo
bestimmt; es macht auf diese Weise mehr Sinn, weil Sie nach der Konstruktion foo.prototype
einen alten Wert zuweisen konnten, der foo
bricht, indem er es in eine Instanz einer Klasse verwandelt, für die es nicht initialisiert wurde.
Der Konstruktor Foo
würde in ähnlicher Weise keinen Sinn ergeben, wenn er als eine Instanz der Klasse agieren würde, die er definiert; es wurde nicht von selbst initialisiert, so dass nicht sicher angenommen werden kann, dass es das für seine Instanzen beabsichtigte Verhalten erfüllen wird. Foo
ist eine Instanz von Function
, die Sinn macht, weil es aufgerufen werden kann. Daher ist der Prototyp vonFoo
ist Function.prototype
, nichtFoo.prototype
.
Die Beziehung zwischen einem foo
und dessen Prototyp eingerichtet ist, wenn Sie foo = new Foo
nennen.Da erwartet wird, dass der Rumpf des Konstruktors Foo
die Instanz initialisiert, ist dies der nur Zeit, foo
seinen Prototyp zu geben, der Sinn macht. Der Prototyp stellt einem Objekt seine üblichen Verhaltensweisen zur Verfügung, der Konstruktor initialisiert das Objekt, so dass diese Verhaltensweisen wie vorgesehen funktionieren. Der Prototyp, der foo
zugeordnet ist, wenn er über new Foo
aufgebaut ist, ist kein anderer als Foo.prototype
; Dies geschieht vorFoo
ist für Bequemlichkeit und eine Garantie, dass es möglicherweise nicht durcheinander gebracht werden kann. Danach gibt es keine Möglichkeit, auf den Prototyp von foo
zuzugreifen, ohne explizit durch Foo
zu gehen.
enter code here
Nur Konstruktorfunktionen haben eine Eigenschaft '.prototype ', die verwendet wird, wenn Sie sie mit' new' aufrufen. Alle Objekte haben einen * Prototyp *, aber dies ist keine Eigenschaft. – Bergi