Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объясните как работает... (https://javascript.ru/forum/misc/36396-obyasnite-kak-rabotaet.html)

Alexej 13.03.2013 23:02

Объясните как работает...
 
Почему во втором конструкторе аргументы надо указывать отдельно(если this.base = Obj(name,age), то не работает)
function Obj(name,age){
    this.name = name;
    this.age = age;
};

function Obj2(pr,name,age){
    this.base = Obj;
    this.base(name,age);
    this.property = pr;
}

var newOb = new Obj2('Cool','Alexej',22);

newOb['name'] //выведет Alexej

danik.js 13.03.2013 23:18

Нужно явно указать контекст при вызове Obj: Obj.call(this, name, age)

рони 13.03.2013 23:34

Цитата:

Сообщение от danik.js
Obj.call(this, name, age)

мне просто интересно, как это заменит
this.base = Obj;
this.base(name,age);

jsgeek 14.03.2013 00:04

рони, как то так :)
function Obj(name,age){
    this.name = name;
    this.age = age;
};

function Obj2(pr,name,age){
    this.base = Obj.call(this, name, age) // совет danik.js  
    //this.base(name,age);
    this.property = pr;
}

var newOb = new Obj2('Cool','Alexej',22);

alert(newOb['name']) //выведет Alexej

danik.js 14.03.2013 00:04

Я так понял что Alexej не может разобраться, почему Obj нельзя вызвать напрямую. Но вобще что хочет автор, и что его не устраивает в текущей реализации - мне непонятно.

dmitriymar 14.03.2013 00:15

Цитата:

Сообщение от jsgeek
this.base = Obj.call(this, name, age)

в итоге:
this.base= ундеф...

рони 14.03.2013 00:17

jsgeek,
в таком случае базу больше нельзя использовать
function Obj(name,age){
    this.name = name;
    this.age = age;
};

function Obj2(pr,name,age){
    this.base = Obj.call(this, name, age) // совет danik.js
    //this.base(name,age);
    this.property = pr;
}

var newOb = new Obj2('Cool','Alexej',22);

alert(newOb['name']) //выведет Alexej
alert(newOb['base'])

Цитата:

Сообщение от danik.js
Я так понял что Alexej не может разобраться, почему Obj нельзя вызвать напрямую

я тоже это хотелбы понять, может кто-то обьяснит или даст ссылку.

jsgeek 14.03.2013 00:19

dmitriymar, рони, в самом деле...

jsgeek 14.03.2013 00:51

После медитации пришел к такому умозаключению.
Конструктор оперирует вновь созданным объектом, который доступен по ссылке this.
Выражение
this.base = Obj(name,age)

возвращает undefined так как без new это обычная функция.
Если сделать так:
this.base = new Obj(name, age);

В
this.base
будет объект класса Obj
А теперь самое интересное:
Вызов
Obj.call(this, name, age)

подсовывает конструктору Obj не новый объект а тот которым оперирует Obj2. Т.е. эти два конструктора оперируют одним объектом.
И наконец-то моя ошибка:
this.base = Obj.call(this, name, age)
this.base === undefined так как конструктор не возвращает объект а инициализирует его.

dmitriymar 14.03.2013 00:55

Цитата:

Сообщение от jsgeek
подсовывает конструктору Obj не новый объект а тот которым оперирует Obj2.

не подсовывает:nono:
контекст меняет


Часовой пояс GMT +3, время: 04:05.