2016-05-27 4 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(); 

Когда я вызываю mike.sayName(); он не работает, и я получаю mike.sayName не является функцией. Я не понимаю, почему? Используя Object.create, я разрешаю другому .prototype наследовать от прототипа Person, у которого был метод sayName. Теперь, почему я не могу запустить mike.sayName();Целевые прототипы и наследование прототипов

Спасибо !!!

+0

Установить 'Other.prototype' перед использованием' новый Other' – csharpfolk

ответ

1

Свойство конструктора prototype является единственным, потому что оно используется как значение [[Prototype]] при создании экземпляров. Однако замена prototype на другой объект повлияет только на экземпляры, созданные после изменения, это не приведет к магическому обновлению [[Prototype]] существующих экземпляров.

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

Так просто поменять порядок:

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

Можете ли вы объяснить, почему? Я удивлен, потому что в случае Person-I создаю FIRST экземпляр julia, затем ПОСЛЕВЫЕ ЗАПИСИ создаю Person.prototype, а новый объект julia по-прежнему имеет доступ к методу Person.prototype. Однако, майк не делает. – juliascoding

+0

Это потому, что одна вещь добавляет метод к существующему объекту, а другая заменяет объект другим. – Oriol

+0

О, хорошо, спасибо! – juliascoding

Смежные вопросы