2013-10-12 3 views
3

Я играю в консоли, пытаясь понять прототипное наследование. Я знаком с классическим наследованием, но я никогда не использовал никакого наследования в моей работе JS.Javascript Simple Prototypal Inheritance

Если у меня есть:

var foo = { 
    cat: "oliver" 
} 

var bar = Object.create(foo); 

foo.prototype = { 
    dog: "rover" 
} 

Когда я делаю:

dir(bar.dog) 

или

dir(foo.dog) 

Я ожидаю увидеть rover, но они оба возвращаются в undefined.

Что мне не хватает?

Заранее спасибо.

+0

Я предполагаю, что я смущен: это свойство прототипа работает над экземплярами объектов (функций) и тем не менее Object.create может использовать объектный литерал в качестве прототипа? Или этот шаблон работает только с конструкторами? –

+0

Вы не можете установить прототип в экземплярах объекта (например, литерал объекта foo) и ожидать, что он будет работать как установка прототипа функций. Все, что вы сделали, это добавить свойство с именем prototype в foo, но среда выполнения JS не будет использовать его для поиска. Давид дал самый правильный ответ. Дополнительная информация о том, что такое прототип: http://stackoverflow.com/a/16063711/1641941 – HMR

ответ

1

это будет правильный код, чтобы выполнить то, что вы пытаетесь:

var foo = Object.create({dog:'rover'}); 

foo.cat = 'oliver'; 

var bar = Object.create(foo); 

этот путь foo наследует от объекта со свойством называется dog, то bar наследуется от того же объекта, поскольку он наследует от foo

Теперь, проверьте с bar.dog и bar.cat он печатает rover и oliver соответственно

обратите внимание, что .prototype работает только для доступа или установить объект-прототип функции, что вы делаете в этом коде не так, это правильно:

var a = function(){ 
} 

a.prototype = {}; 

для доступа прототипа объекта вы делаете это как это:

a = {}; 

a.\__proto__.foo = 'bar'; 

однако это позволяет получить или установить свойства этого объекта-прототипа, но не заменить его на другой.

2

Элементы прототипа доступны только при его создании. foo.cat доступен, потому что это похоже на «статическое» свойство (с языков, поддерживающих такую ​​поддержку кода, например PHP). Кроме того, вы должны наследоваться от foo прототипа при выполнении вашего Object.create

var foo = function(){ }; 
foo.cat = "oliver"; 

var bar = Object.create(foo.prototype); 

foo.prototype.dog = "rover"; 

console.log(bar.dog); // yields "rover", modifying the prototype of "foo" alter the members of "bar" instance 
3

Вы видите это из-за этой линии:

foo.prototype = { 
    dog: "rover" 
} 

Вы не можете изменить прототип объекта после создания этого объекта.

Что вы можете сделать, это изменить существующий прототип как это:

foo.dog = "rover"; 

Помните, что foo является прототипом bar.

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