Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.03.2013, 23:02
Интересующийся
Отправить личное сообщение для Alexej Посмотреть профиль Найти все сообщения от Alexej
 
Регистрация: 20.02.2013
Сообщений: 18

Объясните как работает...
Почему во втором конструкторе аргументы надо указывать отдельно(если 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
Ответить с цитированием
  #2 (permalink)  
Старый 13.03.2013, 23:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Нужно явно указать контекст при вызове Obj: Obj.call(this, name, age)
Ответить с цитированием
  #3 (permalink)  
Старый 13.03.2013, 23:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Сообщение от danik.js
Obj.call(this, name, age)
мне просто интересно, как это заменит
this.base = Obj;
this.base(name,age);
Ответить с цитированием
  #4 (permalink)  
Старый 14.03.2013, 00:04
Аспирант
Отправить личное сообщение для jsgeek Посмотреть профиль Найти все сообщения от jsgeek
 
Регистрация: 13.02.2013
Сообщений: 34

рони, как то так
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
Ответить с цитированием
  #5 (permalink)  
Старый 14.03.2013, 00:04
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Я так понял что Alexej не может разобраться, почему Obj нельзя вызвать напрямую. Но вобще что хочет автор, и что его не устраивает в текущей реализации - мне непонятно.
Ответить с цитированием
  #6 (permalink)  
Старый 14.03.2013, 00:15
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от jsgeek
this.base = Obj.call(this, name, age)
в итоге:
this.base= ундеф...
Ответить с цитированием
  #7 (permalink)  
Старый 14.03.2013, 00:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

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 нельзя вызвать напрямую
я тоже это хотелбы понять, может кто-то обьяснит или даст ссылку.
Ответить с цитированием
  #8 (permalink)  
Старый 14.03.2013, 00:19
Аспирант
Отправить личное сообщение для jsgeek Посмотреть профиль Найти все сообщения от jsgeek
 
Регистрация: 13.02.2013
Сообщений: 34

dmitriymar, рони, в самом деле...
Ответить с цитированием
  #9 (permalink)  
Старый 14.03.2013, 00:51
Аспирант
Отправить личное сообщение для jsgeek Посмотреть профиль Найти все сообщения от jsgeek
 
Регистрация: 13.02.2013
Сообщений: 34

После медитации пришел к такому умозаключению.
Конструктор оперирует вновь созданным объектом, который доступен по ссылке 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 так как конструктор не возвращает объект а инициализирует его.

Последний раз редактировалось jsgeek, 14.03.2013 в 00:54.
Ответить с цитированием
  #10 (permalink)  
Старый 14.03.2013, 00:55
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работает CKEditor? ololosh Общие вопросы Javascript 9 20.12.2012 17:50
не работает скрипт как ссылка Abraham jQuery 31 14.06.2011 03:04
подскажите как работает setTimeout ruslan368560 Общие вопросы Javascript 1 17.05.2011 18:48
InnerHTML почему-то работает не так, как хотелось бы. помогите Dima00782 Общие вопросы Javascript 2 13.06.2010 21:17
Как работает обработчик onMouseMove() bayah Общие вопросы Javascript 3 29.04.2010 14:36