Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.04.2014, 12:16
Интересующийся
Отправить личное сообщение для Universe Посмотреть профиль Найти все сообщения от Universe
 
Регистрация: 11.06.2011
Сообщений: 20

Как правильно реализовать наследование?
Добрый день. Разбираюсь с наследованием и хотел спросить, как правильно его реализовать.
Например есть такой вариант:
(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;

то она и меняется только у этого бокса.

Следоавтельно вопрос: правильно ли организовано наследование в примере выше и если да, то как мне создать "общую" переменную в такой реализации?
Ответить с цитированием
  #2 (permalink)  
Старый 10.04.2014, 12:22
Интересующийся
Отправить личное сообщение для Universe Посмотреть профиль Найти все сообщения от Universe
 
Регистрация: 11.06.2011
Сообщений: 20

Посмотрел структуру объектов в консоли. Получается что в моей реализации создаётся "промежуточный" объект.


Почему прототипом моего объекта box становится Function, а не Rect?
Ответить с цитированием
  #3 (permalink)  
Старый 10.04.2014, 12:26
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

Если утрировать, то как-то так:
(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);


Сообщение от Universe Посмотреть сообщение
Почему прототипом моего объекта box становится Function, а не Rect?
Потому что Rect - function, а function - instanceof object. Что вы вообще хотели получить?
__________________
29375, 35

Последний раз редактировалось Aetae, 10.04.2014 в 12:32.
Ответить с цитированием
  #4 (permalink)  
Старый 10.04.2014, 13:09
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

вместо
Сообщение от Universe
Box.prototype.someVar = 25;
надо
Rect.prototype.someVar = 25;

т.к. Box наследует от Rect

Можешь это почитать

Сообщение от Universe
Следоавтельно вопрос: правильно ли организовано наследование в примере выше и если да, то как мне создать "общую" переменную в такой реализации?
я ответил про общую для Rect & Box

function Rect() {}
Rect.prototype.x = 1;

function Box() {}
Box.prototype = Object.create(Rect.prototype);

var box = new Box();
alert(box.x);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 10.04.2014 в 13:14.
Ответить с цитированием
  #5 (permalink)  
Старый 10.04.2014, 13:11
Интересующийся
Отправить личное сообщение для Universe Посмотреть профиль Найти все сообщения от Universe
 
Регистрация: 11.06.2011
Сообщений: 20

Я просто к чему спрашиваю, может правильнее было бы присваивать прототипу Box прототип Rect?
Вот так:
Box.prototype = Object.create(Rect).prototype;


Не вижу смысла в этой доп. прослойке.
Ответить с цитированием
  #6 (permalink)  
Старый 10.04.2014, 13:26
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от Universe
Логика подсказывает что её нужно прописывать на прототип при объявлении, например вот так:
Box.prototype.someVar = 25;

Но если я меняю такую переменную на уровне бокса, например:
box.someVar = 30;
Лично мне логика подсказывает, что менять "переменную" (свойством называется) нужно там, куда её и "прописывал". Т.е. меняй свойство в прототипе:
Box.prototype.someVar = 30;
Ответить с цитированием
  #7 (permalink)  
Старый 10.04.2014, 13:47
Интересующийся
Отправить личное сообщение для Universe Посмотреть профиль Найти все сообщения от Universe
 
Регистрация: 11.06.2011
Сообщений: 20

Цитата:
Т.е. меняй свойство в прототипе:
Box.prototype.someVar = 30;
Мне сейчас интересен именно вариант изменения через свойство переменной. Смысл мне тогда от наследования, если придётся всегда явно обращаться к его прототипу.
Цитата:
надо
Rect.prototype.someVar = 25;
т.к. Box наследует от Rect
Структурно может быть и так, но в результате тот же эффект

хотя с объектами такого не происходит. Я понимаю что из ситуации можно выйти путём создания геттера и сеттера для изминения примитивного значения
Box.prototype.someVar= 30;
	Box.prototype.getVal = function (){
		return this.someVar;
	}
	Box.prototype.setVal = function(val){
		Box.prototype.someVar= val;
	}

Но мне важно понять, почему именно примитивные значения не являются общими ссылками?
Ответить с цитированием
  #8 (permalink)  
Старый 10.04.2014, 14:09
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от Universe
Смысл мне тогда от наследования, если придётся всегда явно обращаться к его прототипу
Смысл наследования не в том, чтобы неявно обращаться к прототипу. Вообще, нужное тебе поведение в ООП реализуется через статические члены класса:
Box.someVar= 30; // вместо Box.prototype.someVar= 30
Ответить с цитированием
  #9 (permalink)  
Старый 10.04.2014, 14:53
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от Universe
Я просто к чему спрашиваю, может правильнее было бы присваивать прототипу Box прототип Rect?
Вот так:
Box.prototype = Object.create(Rect).prototype;
Box.prototype = Object.create(Rect.prototype);



Сообщение от Universe
с объектами такого не происходит
Сообщение от Universe
почему именно примитивные значения не являются общими ссылками?
С ссылками на объекты все точно так же:
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

Так уж сделано, что явное присваивание создает собственное свойство.

Последний раз редактировалось Octane, 10.04.2014 в 15:27.
Ответить с цитированием
  #10 (permalink)  
Старый 10.04.2014, 16:05
Интересующийся
Отправить личное сообщение для Universe Посмотреть профиль Найти все сообщения от Universe
 
Регистрация: 11.06.2011
Сообщений: 20

Большое спасибо за помощь!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пасоны, как правильно парсить параметры? megaupload Оффтопик 15 05.05.2013 14:44
filter(this,this) как правильно сделать? Smip jQuery 5 23.02.2013 03:07
Как правильно прицепить обработку события slowklg Events/DOM/Window 6 15.03.2012 16:20
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14
Как правильно оформить Send() Алекс97 AJAX и COMET 20 30.10.2008 19:19