2013-08-22 3 views
1

Я искал это как сумасшедший, и я до сих пор не понимаю.Цепочка Javascript Конструкторы

Если я создал дочерние и родительские объекты, такие как следующие:

var Child = function(name, toy) 
{ 
    this.toy = toy; 
    Parent.call(this, name); 
} 

var Parent = function(name) 
{ 
    this.name = name; 
} 

//Child.prototype = new Parent(); 

я не нужно раскомментировать эту строку так, чтобы иметь возможность получить следующий результат:

var bobby = new Child("Robert", "Lego"); 
document.write(bobby.name + " " + bobby.toy); 

//Result: Robert Lego 

Мой (возможно неправильно) понимание того, что линии

Child.prototype = new Parent(); 

устанавливает прототип того, что создается конструктором Child, чтобы быть тем, что создается конструктором родителя. Следовательно, без этой линии, линии

Parent.call(this, name); 

(который я считаю, вызывает конструктор Родитель, установив этот контекст ребенка, и передает имя) не должны реально работать.

Что не так с моим пониманием?

Заранее благодарим за любую помощь! :)

+0

Почему вы не верите 'Parent.call (это, имя);' должен работать? Он просто вызывает функцию «Родитель», которую вы определяете. –

ответ

0

Javascript не знает, что функция является конструктором. Он рассматривается только как один, когда вы вызываете его, используя ключевое слово new. Если бы вы назвали его без new, это было бы по-другому.

Parent.call(this, name) просто вызывает Parent как регулярную функцию, используя недавно построенный Child (потому что вы использовали new ключевое слово, когда вы построили ребенка) в качестве this.

Таким образом, вся ваша функция parent в этом случае назначает имя получаемому объекту. В этом случае Child, который вы только что создали.

Сравните ваш ребенок к этому:

var Child = function(name, toy) 
{ 
    var child = new Parent(name); 
    child.toy = toy; 
    return child; 
} 

Здесь функция ребенок использует Parent как конструктор.

Смежные вопросы