Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.11.2012, 13:55
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Прототипное наследование не распространяется на вложенные свойства?
Вот у этой птицы 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().
Ответить с цитированием
  #2 (permalink)  
Старый 19.11.2012, 14:13
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Всё верно, вы берёте свойство из прототипа и меняете его, поэтому оно поменяется у всех инстансов, поэтому все свойства должны определятся в конструкторе, а не тянуться из прототипа. Прототип для методов или общих свойств.
__________________
kobezzza
code monkey
Ответить с цитированием
  #3 (permalink)  
Старый 19.11.2012, 14:15
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

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);
__________________
.
Ответить с цитированием
  #4 (permalink)  
Старый 19.11.2012, 14:18
Аспирант
Отправить личное сообщение для vashurin Посмотреть профиль Найти все сообщения от vashurin
 
Регистрация: 01.04.2008
Сообщений: 52

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

Код:
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());
Ответить с цитированием
  #5 (permalink)  
Старый 19.11.2012, 14:31
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

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());
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск