Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Веб-программирование > JavaScript / HTML

JavaScript / HTML Создание динамической разметки страниц

Ответ
 
Опции темы
Старый 17.08.2013, 20:59   #1
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 618 полезных сообщений
(для 2,416 пользователей)
Вопрос Классическое наследование (OOP)

function P() {
    
this.= [];
}
var 
= new P();

function 
C() {
}
C.prototype p;

var 
= new C(),
    
= new C();

console.log(a.== b.m); 
выведет true, значит ссылки указывают на один и тот же массив О_о
если не юзать "наследование", то все норм
почему так происходит?

тему криво назвал, уже не могу исправить :(

upd:
Вроде понял почему, потому что недостающие свойства у С берутся у p. А массивы (и объекты вообще) при присваивании не копируются, а просто приравниваются ссылки.

upd:
Чото нифига не так, даже если к прототипу приравнивать каждый раз новый экземпляр P, то тоже самое :(
В чем тогда дело?
(Offline)
 
Ответить с цитированием
Старый 17.08.2013, 21:29   #2
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ты присваиваешь прототип, но не вызваешь конструктора отца.
Вот тебе офигенная ссылка с глубоким объяснением наследования в 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 
= new Child();
var 
= new Child();
console.log(a.arr == b.arr); // false 

Последний раз редактировалось moka, 27.08.2013 в 10:30.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
den (17.08.2013)
Старый 26.08.2013, 12:29   #3
Черный крыс
 
Сообщений: n/a
Ответ: Классическое наследование (OOP)

Как сказал мока нужно вызвать конструктор предка. Более удобный вариант :

// Вспомогательная функция
function extend(ChildParent)
{
    var 
= function() { };
    
F.prototype Parent.prototype;
    
Child.prototype = new F();
    
Child.prototype.constructor Child;
    
Child.superclass Parent.prototype;
}
            
function 
P()
{
    
this.= []; // инициализация поля класса
}
            
function 
C()
{
    
C.superclass.constructor.call(this)
}
extend(CP);
            
var 
= new C(), = new C();
            
alert(a.== b.m); 

Последний раз редактировалось Черный крыс, 26.08.2013 в 13:33.
 
Ответить с цитированием
Старый 26.08.2013, 15:07   #4
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Классическое наследование (OOP)

Зачем иметь superclass если и так есть указатель на отцовский класс (.prototype), тем более тут у тебя ещё и доп функция посредник создаётся - тоже не вижу смысла.

Тем более constructor - не обязательно указывать, следственно в твоём коде есть зависимость что отцовский класс должен указать конструктор - а это не всегда будет так.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Черный крыс (26.08.2013)
Старый 26.08.2013, 15:22   #5
Черный крыс
 
Сообщений: n/a
Ответ: Классическое наследование (OOP)

Тогда вопрос... А почему просто не использовать так ? :

function P()
{
    
this.= [];
}
            
function 
C()
{
    
P.call(this);
}
            
var 
= new C(), = new C();
            
alert(a.m==b.m); // false 
 
Ответить с цитированием
Старый 27.08.2013, 10:29   #6
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Классическое наследование (OOP)

Сообщение от Diablo1909 Посмотреть сообщение
Тогда вопрос... А почему просто не использовать так ? :

function P()
{
    
this.= [];
}
            
function 
C()
{
    
P.call(this);
}
            
var 
= new C(), = new C();
            
alert(a.m==b.m); // false 
Потому что так ты не наследуешь prototype методы:
function P() {
  
this.= [ ];
}
P.prototype.method = function() {
  
this.m.push(Math.random());
}

function 
C() {
  
P.call(this);
}

C.method(); // Exception: 'method' is undefined 
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Phantom (27.08.2013), Черный крыс (27.08.2013)
Старый 27.08.2013, 12:02   #7
Черный крыс
 
Сообщений: n/a
Ответ: Классическое наследование (OOP)

Прочитал про это дело, все вроде стало на свои места, только одно не радует, что ООП в JavaScript реализовано совсем уж мутно.
 
Ответить с цитированием
Старый 27.08.2013, 12:18   #8
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Классическое наследование (OOP)

А по сути то ООП и нету
Есть объект, и есть концепт прототипирования, нету никаких классов и ООП по сути. Это так сказать "эмуляция".

Да и когда вникнешь в суть прототипов, всё встанет на свои места и увидишь не мало плюсов в таких решениях. Главное тут это гибкость.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Phantom (27.08.2013), Черный крыс (27.08.2013)
Старый 27.08.2013, 17:20   #9
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,177
Написано 725 полезных сообщений
(для 1,785 пользователей)
Ответ: Классическое наследование (OOP)

Просто при программировании на JavaScript нужно иначе немного на логику смотреть. Я сначала тоже плевался и называл JavaScript самым идиотским и упоротым языком. Но теперь, когда понял что и как, мне он начал нравиться. Мне нравится на нём код писать. Серьёзно.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Phantom за это полезное сообщение:
den (27.08.2013), moka (27.08.2013)
Старый 27.08.2013, 18:11   #10
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: Классическое наследование (OOP)

Аналогично.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 16:18.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com