Объясните как работает...
Почему во втором конструкторе аргументы надо указывать отдельно(если 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
|
Нужно явно указать контекст при вызове Obj: Obj.call(this, name, age)
|
Цитата:
this.base = Obj; this.base(name,age); |
рони, как то так :)
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
|
Я так понял что Alexej не может разобраться, почему Obj нельзя вызвать напрямую. Но вобще что хочет автор, и что его не устраивает в текущей реализации - мне непонятно.
|
Цитата:
this.base= ундеф... |
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'])
Цитата:
|
dmitriymar, рони, в самом деле...
|
После медитации пришел к такому умозаключению.
Конструктор оперирует вновь созданным объектом, который доступен по ссылке 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, я это и имел в виду, просто для ясности происходящего упростил :)
|
что-то вот такое хочется )))
function Obj(name,age){
this.name = name;
this.age = age;
return Obj
};
function Obj2(pr,name,age){
this.base = Obj.call(this, name, age);
this.property = pr;
}
var newOb = new Obj2('Cool','Alexej',22);
alert(newOb['name']) //выведет Alexej
newOb['base']('test',5)
alert(newOb['name'])
|
рони, ну да return в Obj помогает достичь желаемого в данном контексте.
Но:
var o1 = new Obj('test', 11)
сделает o1 еще одним конструктором... Вообщем нужно использовать прототипы :yes: Или на крайняк заменить в конструкторе return Objна
if (!(this instanceof Obj)) {
return Obj;
}
Но я бы не советовал что-то подобное делать в конструкторе, т.к. он не для таких манипуляций предназначен. |
| Часовой пояс GMT +3, время: 15:17. |