2016-05-27 12 views
0
function Person(name){ 
    this.name=name 
} 
var julia=new Person("Julia"); 

Person.prototype.sayName=function(){ 
return "Hello, dear "+ this.name; 
} 

function Other(name){ 
this.name=name; 
} 

var mike=new Other("Mike"); 

Other.prototype=Object.create(Person.prototype); 
mike.sayName(); 

Wenn ich mike.sayName() aufrufen; es funktioniert nicht und ich bekomme mike.sayName ist keine Funktion. Ich verstehe nicht warum? Mit Object.create habe ich Other.prototype von dem Person-Prototyp erben lassen, der die Methode sayName hatte. Nun, warum kann ich mike.sayName() nicht ausführen?Verketten von Prototypen und Prototyp Vererbung

Danke !!!

+0

Set 'Other.prototype' vor mit' neuen Other' – csharpfolk

Antwort

1

Die Eigenschaft eines Konstruktors ist nur deshalb besonders, weil sie beim Erstellen von Instanzen als Wert [[Prototyp]] verwendet wird. Das Ersetzen von prototype durch ein anderes Objekt wirkt sich jedoch nur auf Instanzen aus, die nach der Änderung erstellt wurden. Es aktualisiert die [[Prototype]] der vorhandenen Instanzen nicht auf magische Weise.

var oldproto = Other.prototype; 
var mike = new Other("Mike"); 
Object.getPrototypeOf(mike); // oldproto 
Other.prototype = Object.create(Person.prototype); 
Object.getPrototypeOf(mike); // oldproto 

So tauschen Sie einfach den Auftrag:

Other.prototype = Object.create(Person.prototype); 
var mike = new Other("Mike"); 
+0

Können Sie erklären, warum? Ich bin überrascht, weil ich im Falle von Person-I FIRST die Instanz julia erstelle, dann AFTERWARDS Ich erstelle den Person.prototype und das neue Objekt julia hat immer noch Zugriff auf die Methode Person.prototype. Mike jedoch nicht. – juliascoding

+0

Das liegt daran, dass eine Sache eine Methode zu einem bestehenden Objekt hinzufügt und eine andere ein Objekt durch eine andere ersetzt. – Oriol

+0

Oh okay vielen Dank! – juliascoding

Verwandte Themen