Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прототипное наследование не распространяется на вложенные свойства? (https://javascript.ru/forum/misc/33324-prototipnoe-nasledovanie-ne-rasprostranyaetsya-na-vlozhennye-svojjstva.html)

novikov 19.11.2012 13:55

Прототипное наследование не распространяется на вложенные свойства?
 
Вот у этой птицы 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().

kobezzza 19.11.2012 14:13

Всё верно, вы берёте свойство из прототипа и меняете его, поэтому оно поменяется у всех инстансов, поэтому все свойства должны определятся в конструкторе, а не тянуться из прототипа. Прототип для методов или общих свойств.

Skipp 19.11.2012 14:15

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);

vashurin 19.11.2012 14:18

Цитата:

Сообщение от kobezzza (Сообщение 216687)
Всё верно, вы берёте свойство из прототипа и меняете его, поэтому оно поменяется у всех инстансов, поэтому все свойства должны определятся в конструкторе, а не тянуться из прототипа. Прототип для методов или общих свойств.

Да, тогда у автора ног будет столько, сколько он захочет :)

Код:

var Animal = function(){
        this.public = {}
        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());


Dim@ 19.11.2012 14:31

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, время: 07:09.