|
JavaScript / HTML Создание динамической разметки страниц |
18.08.2013, 00:59
|
#1
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Классическое наследование (OOP)
function P() { this.m = []; } var p = new P();
function C() { } C.prototype = p;
var a = new C(), b = new C();
console.log(a.m == b.m);
выведет true, значит ссылки указывают на один и тот же массив О_о
если не юзать "наследование", то все норм
почему так происходит?
тему криво назвал, уже не могу исправить :(
upd:
Вроде понял почему, потому что недостающие свойства у С берутся у p. А массивы (и объекты вообще) при присваивании не копируются, а просто приравниваются ссылки.
upd:
Чото нифига не так, даже если к прототипу приравнивать каждый раз новый экземпляр P, то тоже самое :(
В чем тогда дело?
|
(Offline)
|
|
18.08.2013, 01:29
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ты присваиваешь прототип, но не вызваешь конструктора отца.
Вот тебе офигенная ссылка с глубоким объяснением наследования в JS: http://www.objectplayground.com/
Там же есть отличный playground где можешь попробовать разные техники OOP в JS и посмотреть на визуальную структуру классов. Тебе нужно Classical Inheritance.
ЗЫ
function Parent() { this.arr = [ ]; }
function Child() { Parent.call(this); }
Child.prototype = Object.create(Parent.prototype);
var a = new Child(); var b = new Child(); console.log(a.arr == b.arr); // false
Последний раз редактировалось moka, 27.08.2013 в 14:30.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.08.2013, 16:29
|
#3
|
|
Ответ: Классическое наследование (OOP)
Как сказал мока нужно вызвать конструктор предка. Более удобный вариант :
// Вспомогательная функция function extend(Child, Parent) { var F = function() { }; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.superclass = Parent.prototype; } function P() { this.m = []; // инициализация поля класса } function C() { C.superclass.constructor.call(this) } extend(C, P); var a = new C(), b = new C(); alert(a.m == b.m);
Последний раз редактировалось Черный крыс, 26.08.2013 в 17:33.
|
|
|
26.08.2013, 19:07
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Классическое наследование (OOP)
Зачем иметь superclass если и так есть указатель на отцовский класс (.prototype), тем более тут у тебя ещё и доп функция посредник создаётся - тоже не вижу смысла.
Тем более constructor - не обязательно указывать, следственно в твоём коде есть зависимость что отцовский класс должен указать конструктор - а это не всегда будет так.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.08.2013, 19:22
|
#5
|
|
Ответ: Классическое наследование (OOP)
Тогда вопрос... А почему просто не использовать так ? :
function P() { this.m = []; } function C() { P.call(this); } var a = new C(), b = new C(); alert(a.m==b.m); // false
|
|
|
27.08.2013, 14:29
|
#6
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Классическое наследование (OOP)
Сообщение от Diablo1909
Тогда вопрос... А почему просто не использовать так ? :
function P() { this.m = []; } function C() { P.call(this); } var a = new C(), b = new C(); alert(a.m==b.m); // false
|
Потому что так ты не наследуешь prototype методы:
function P() { this.m = [ ]; } P.prototype.method = function() { this.m.push(Math.random()); } function C() { P.call(this); } C.method(); // Exception: 'method' is undefined
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
27.08.2013, 16:02
|
#7
|
|
Ответ: Классическое наследование (OOP)
Прочитал про это дело, все вроде стало на свои места, только одно не радует, что ООП в JavaScript реализовано совсем уж мутно.
|
|
|
27.08.2013, 16:18
|
#8
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Классическое наследование (OOP)
А по сути то ООП и нету
Есть объект, и есть концепт прототипирования, нету никаких классов и ООП по сути. Это так сказать "эмуляция".
Да и когда вникнешь в суть прототипов, всё встанет на свои места и увидишь не мало плюсов в таких решениях. Главное тут это гибкость.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
27.08.2013, 21:20
|
#9
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Классическое наследование (OOP)
Просто при программировании на JavaScript нужно иначе немного на логику смотреть. Я сначала тоже плевался и называл JavaScript самым идиотским и упоротым языком. Но теперь, когда понял что и как, мне он начал нравиться. Мне нравится на нём код писать. Серьёзно.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Phantom за это полезное сообщение:
|
den (28.08.2013), moka (27.08.2013)
|
27.08.2013, 22:11
|
#10
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Классическое наследование (OOP)
Аналогично.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:55.
|