Объясните как работает...
Почему во втором конструкторе аргументы надо указывать отдельно(если 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, время: 23:45. |