forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   JavaScript / HTML (http://forum.boolean.name/forumdisplay.php?f=136)
-   -   Классическое наследование (OOP) (http://forum.boolean.name/showthread.php?t=18470)

den 18.08.2013 00:59

Классическое наследование (OOP)
 
PHP код:

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, то тоже самое :(
В чем тогда дело?

moka 18.08.2013 01:29

Ты присваиваешь прототип, но не вызваешь конструктора отца.
Вот тебе офигенная ссылка с глубоким объяснением наследования в JS: http://www.objectplayground.com/
Там же есть отличный playground где можешь попробовать разные техники OOP в JS и посмотреть на визуальную структуру классов. Тебе нужно Classical Inheritance.

ЗЫ

PHP код:

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 


Черный крыс 26.08.2013 16:29

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

PHP код:

// Вспомогательная функция
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); 


moka 26.08.2013 19:07

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

Тем более constructor - не обязательно указывать, следственно в твоём коде есть зависимость что отцовский класс должен указать конструктор - а это не всегда будет так.

Черный крыс 26.08.2013 19:22

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

PHP код:

function P()
{
    
this.= [];
}
            
function 
C()
{
    
P.call(this);
}
            
var 
= new C(), = new C();
            
alert(a.m==b.m); // false 


moka 27.08.2013 14:29

Ответ: Классическое наследование (OOP)
 
Цитата:

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

PHP код:

function P()
{
    
this.= [];
}
            
function 
C()
{
    
P.call(this);
}
            
var 
= new C(), = new C();
            
alert(a.m==b.m); // false 


Потому что так ты не наследуешь prototype методы:
PHP код:

function P() {
  
this.= [ ];
}
P.prototype.method = function() {
  
this.m.push(Math.random());
}

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

C.method(); // Exception: 'method' is undefined 


Черный крыс 27.08.2013 16:02

Ответ: Классическое наследование (OOP)
 
Прочитал про это дело, все вроде стало на свои места, только одно не радует, что ООП в JavaScript реализовано совсем уж мутно.

moka 27.08.2013 16:18

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

Да и когда вникнешь в суть прототипов, всё встанет на свои места и увидишь не мало плюсов в таких решениях. Главное тут это гибкость.

Phantom 27.08.2013 21:20

Ответ: Классическое наследование (OOP)
 
Просто при программировании на JavaScript нужно иначе немного на логику смотреть. Я сначала тоже плевался и называл JavaScript самым идиотским и упоротым языком. Но теперь, когда понял что и как, мне он начал нравиться. Мне нравится на нём код писать. Серьёзно.

moka 27.08.2013 22:11

Ответ: Классическое наследование (OOP)
 
Аналогично.


Часовой пояс GMT +4, время: 01:52.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot