Прототипное наследование не распространяется на вложенные свойства?
Вот у этой птицы 2 ноги. Ясно, как работает наследование.
var Animal = function(){};
Animal.prototype = {
legs: 0
};
var bird = new Animal();
bird.legs = 2;
var dog = new Animal();
dog.legs = 4;
console.log(bird.legs);
jsfiddle А у этой птицы 4 ноги. Интуитивно непонятно.
var Animal = function(){};
Animal.prototype = {
public: {
legs: 0
}
};
var bird = new Animal();
bird.public.legs = 2;
var dog = new Animal();
dog.public.legs = 4;
console.log(bird.public.legs);
jsfiddle Получается, что наследование распространяется только на свои свойства, и не распространяется на вложенные. Понятно, что за фигурными скобками скрывается код типа new Object(). |
Всё верно, вы берёте свойство из прототипа и меняете его, поэтому оно поменяется у всех инстансов, поэтому все свойства должны определятся в конструкторе, а не тянуться из прототипа. Прототип для методов или общих свойств.
|
var Animal = function(){
this.public = new Object();
};
Animal.prototype = {
public: {
legs: 0
}
};
var bird = new Animal();
bird.public.legs = 2;
var dog = new Animal();
dog.public.legs = 4;
alert(bird.public.legs);
|
Цитата:
Код:
var Animal = function(){ |
vashurin
да именно столько будет сколько он захочет фигня с public.legs получается потому что объект передаётся по ссылке, а не создаётся заново повтор твоего кода:
var Animal = function(){
(this.public = {}).legs = 0;
};
Animal.prototype.setLegs = function(n){
this.public.legs = n;
}
Animal.prototype.getLegs = function(){
return this.public.legs;
}
var bird = new Animal();
bird.setLegs(2);
console.log(bird.getLegs());
var dog = new Animal();
dog.setLegs(4);
console.log(dog.getLegs());
|
| Часовой пояс GMT +3, время: 04:26. |