Javascript.RU

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

Наследование на основе прототипов
function Parent() {
    this.a = [];
}
Parent.prototype.dd = function() {
    console.log('f parent');
};
var aa =  new Parent();

function ChildB() {

}
ChildB.prototype = aa;

ChildB.prototype.dd = function() {
    console.log('b child');
};

function ChildC() {

}
ChildC.prototype = aa;

ChildC.prototype.dd = function() {
    console.log('c child');
};

new ChildB().dd();
new ChildC().dd();

Читая статью о наследовании на основе прототипов я похоже что-то упустил. Подскажите что именно.
Ожидалось что в консоле я увижу
b child
c child

А в итоге я получил:
c child
c child

Последний раз редактировалось wondertalik, 06.12.2014 в 15:55.
Ответить с цитированием
  #2 (permalink)  
Старый 06.12.2014, 14:39
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от wondertalik
childB.prototype.dd =
Это равнозначно aa.dd =, потому как:
Сообщение от wondertalik
childB.prototype = aa;
Таким образом, ты два раза записываешь aa.dd

У тебя оба child'а в качестве прототипа имеют один и тот же объект. Ты просто перетираешь его свойства.


Имена конструкторов принято записывать с большой буквы.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 06.12.2014, 14:50
Новичок на форуме
Отправить личное сообщение для wondertalik Посмотреть профиль Найти все сообщения от wondertalik
 
Регистрация: 06.12.2014
Сообщений: 7

childB.prototype = new parent();

childC.prototype =  new parent();
;

Подумал и подправил. Это правильное решение?

Последний раз редактировалось wondertalik, 06.12.2014 в 14:56.
Ответить с цитированием
  #4 (permalink)  
Старый 06.12.2014, 15:03
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от wondertalik
Это правильное решение?
Я не знаю почему во всех учебниках предлагают такой вариант. Но он не совсем верный.

Корректней будет так:

ChildC.prototype =  Object.create(Parent.prototype);
// по идее еще нужно переопределить свойство constructor


Тогда в прототип не попадет свойство a = []. Оно там не нужно. Оно должно быть у каждого инстанса свое.
Делается так:
function ChildC() {
    Parent.call(this);
}
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 06.12.2014, 15:14
Новичок на форуме
Отправить личное сообщение для wondertalik Посмотреть профиль Найти все сообщения от wondertalik
 
Регистрация: 06.12.2014
Сообщений: 7

Сообщение от danik.js Посмотреть сообщение
Я не знаю почему во всех учебниках предлагают такой вариант. Но он не совсем верный.

Корректней будет так:

ChildC.prototype =  Object.create(Parent.prototype);
// по идее еще нужно переопределить свойство constructor


Тогда в прототип не попадет свойство a = []. Оно там не нужно. Оно должно быть у каждого инстанса свое.
Делается так:
function ChildC() {
    Parent.call(this);
}
Написано что в ie8- нет поддержки Object.create(), и предлагается использовать вот это
function inherit(proto) {
    function F() {}
    F.prototype = proto;
    return new F;
}


Сообщение от danik.js Посмотреть сообщение

ChildC.prototype =  Object.create(Parent.prototype);
// по идее еще нужно переопределить свойство constructor


Тогда в прототип не попадет свойство a = []. Оно там не нужно. Оно должно быть у каждого инстанса свое.
Делается так:
function ChildC() {
    Parent.call(this);
}
А если мне нужно чтобы массив а был один для всех с определенными элементами. В потомках он меняться не должен, но обращение к нему обязательно. Как быть?
Ответить с цитированием
  #6 (permalink)  
Старый 06.12.2014, 15:21
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от wondertalik
Написано что в ie8- нет поддержки Object.create(), и предлагается использовать вот это
Если это использовать, то только для IE8. Для нормальных браузеров - Object.create. Это облегчает отладку.
Сообщение от wondertalik
А если мне нужно чтобы массив а был один для всех с определенными элементами
Ну так ты его в прототип Parent'а и ложи.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 06.12.2014, 15:45
Новичок на форуме
Отправить личное сообщение для wondertalik Посмотреть профиль Найти все сообщения от wondertalik
 
Регистрация: 06.12.2014
Сообщений: 7

Сообщение от danik.js Посмотреть сообщение
Если это использовать, то только для IE8. Для нормальных браузеров - Object.create.
Проблема в том, что на терминальном софте используется только ie. Как можно сделать, чтобы если существует create в Object, то используем его иначе inherit?
ChildC.prototype =  Object.create(Parent.prototype);

При таком подходе получается наследование от Object. Я правильно понимаю?
Цитата:
Ну так ты его в прототип Parent'а и ложи.
В смысле объявлять в конструкторе Parent'a?

Последний раз редактировалось wondertalik, 06.12.2014 в 15:53.
Ответить с цитированием
  #8 (permalink)  
Старый 06.12.2014, 16:02
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от wondertalik
При таком подходе получается наследование от Object. Я правильно понимаю?
Нет. Создается объект, прототип которого - переданный аргумент.
Работает примерно как твой inherit.
Сообщение от wondertalik
Как можно сделать, чтобы если существует create в Object, то используем его иначе inherit?
if (!Object.create) {
    Object.create = function() { ... };
}

Сообщение от wondertalik
В смысле объявлять в конструкторе Parent'a?
В смысле объявлять в прототипе Parent'а.
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объект на основе функции Sergey_New Общие вопросы Javascript 22 28.05.2014 09:24
Прототипное наследование не распространяется на вложенные свойства? novikov Общие вопросы Javascript 4 19.11.2012 14:31
Множественное наследование - миф или реальность?! B~Vladi Оффтопик 109 04.09.2012 16:13
Вопрос про ООП, цепочки прототипов. Shaci Общие вопросы Javascript 5 27.01.2010 14:50
Состояние загрузки, на основе фрейм nemo Общие вопросы Javascript 2 09.12.2009 13:23