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