2015-11-29 4 views
7
function funcObj() { } 
funcObj.prototype.greet = "hello"; 
console.log(funcObj.greet) // undefined ??? 
console.log(funcObj.prototype.greet) // hello 

var obj = new funcObj(); 
console.log(obj.greet); // hello 

Wie pro meinem Verständnis in Prototyp. Wenn Sie auf ein Mitglied eines Objekts zugreifen, wird es vom Prototypobjekt abgerufen, wenn es in diesem Objekt nicht verfügbar ist.Funktion Objektprototyp

Meine Fragen sind:

seit Funktionen in Javascript-Objekte sind, warum funcObj.greet -> nicht definiert, aber obj.greet -> hallo?

+0

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

Antwort

2

Ein Prototyp ist nichts anderes als ein Objekt, von dem Instanzen Eigenschaften erben.

So ist funcObj eine Instanz eines anderen Prototyps (der von Function), von dem es alle Eigenschaften geerbt hat. Es hat auch eine , auf der Sie binden können, was auch immer Sie wollen, und dieser Prototyp wird verwendet, sobald Sie es zum Erstellen neuer Instanzen von funcObj (das heißt, wenn Sie es zusammen mit der new keywork, wie new funcObj()) aufrufen.

Aus diesem Grund ist es völlig normal, dass funcObj kein Mitglied namens greet hat, während seine Instanzen es haben.

+0

daher ist jedes Funktionsobjekt selbst eine Instanz des Funktionskonstruktors. Also, wenn ich meine Eigenschaft Function.prototype hinzufügen wird es von allen Funktionsinstanzen geteilt werden, ist das richtig? – Vignesh

+0

Mehr oder weniger. Tatsächlich unterscheidet sich der Bereich, an den die Funktion gebunden ist, der aktuelle * this * Verweis. – skypjack

0

Da die Funktion ein anderes Objekt als die Instanz ist.

Das Setzen einer Eigenschaft auf ein Objekt hat keinen Einfluss auf andere Objekte. nicht einmal die Funktion, dass das Objekt oder der Prototyp eine Instanz von ist.

0

ä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 
Verwandte Themen