Как правильно реализовать наследование?
Добрый день. Разбираюсь с наследованием и хотел спросить, как правильно его реализовать.
Например есть такой вариант:
(function ()
{
function Rect(width, height)
{
this.width = width;
this.height = height;
}
window.Rect = Rect;
}());
(function ()
{
function Box(x,y, width, height)
{
Rect.call(this, width, height);
this.x = x;
this.y = y;
}
Box.prototype = Object.create(Rect);
window.Box = Box;
}());
var box = new Box(5,5,100,100);
var box2 = new Box(5,5,200,200);
Он вполне рабочий, но есть несколько моментов которые я не до конца понимаю. Например, я хочу сделать переменную, которая будет едина для обоих box'ов. Логика подсказывает что её нужно прописывать на прототип при объявлении, например вот так: Box.prototype.someVar = 25; Но если я меняю такую переменную на уровне бокса, например: box.someVar = 30; то она и меняется только у этого бокса. Следоавтельно вопрос: правильно ли организовано наследование в примере выше и если да, то как мне создать "общую" переменную в такой реализации? |
Посмотрел структуру объектов в консоли. Получается что в моей реализации создаётся "промежуточный" объект.
![]() Почему прототипом моего объекта box становится Function, а не Rect? |
Если утрировать, то как-то так:
(function ()
{
var privateVar;
function Box(x,y, width, height)
{
Rect.call(this, width, height);
this.x = x;
this.y = y;
}
Box.prototype = Object.create(Rect);
Box.prototype.setVar = function(val){privateVar = val};
Box.prototype.getVar = function(){return privateVar};
window.Box = Box;
}());
var box = new Box(5,5,100,100);
var box2 = new Box(5,5,200,200);
Цитата:
|
вместо
Цитата:
Rect.prototype.someVar = 25; т.к. Box наследует от Rect Можешь это почитать Цитата:
function Rect() {}
Rect.prototype.x = 1;
function Box() {}
Box.prototype = Object.create(Rect.prototype);
var box = new Box();
alert(box.x);
|
Я просто к чему спрашиваю, может правильнее было бы присваивать прототипу Box прототип Rect?
Вот так: Box.prototype = Object.create(Rect).prototype; Не вижу смысла в этой доп. прослойке. ![]() |
Цитата:
Box.prototype.someVar = 30; |
Цитата:
Цитата:
хотя с объектами такого не происходит. Я понимаю что из ситуации можно выйти путём создания геттера и сеттера для изминения примитивного значения
Box.prototype.someVar= 30;
Box.prototype.getVal = function (){
return this.someVar;
}
Box.prototype.setVal = function(val){
Box.prototype.someVar= val;
}
Но мне важно понять, почему именно примитивные значения не являются общими ссылками? |
Цитата:
Box.someVar= 30; // вместо Box.prototype.someVar= 30 |
Цитата:
Box.prototype = Object.create(Rect.prototype); Цитата:
Цитата:
function A() {}
A.prototype.x = {};
function B() {}
B.prototype = Object.create(A.prototype);
var b = new B;
b.x = {};
alert(A.prototype.x === b.x); //→ false
Так уж сделано, что явное присваивание создает собственное свойство. |
Большое спасибо за помощь!:)
|
| Часовой пояс GMT +3, время: 23:27. |