2013-11-27 3 views
0

Я пытаюсь использовать прототипное наследование, но у меня возникают проблемы.Использование InstanceOf с прототипным наследованием в JavaScript

Это не работает

var Parent = function(){ 
} 

var Child = function(){ 
    this.__proto__ = new Parent(); 
} 

var child = new Child(); 

console.log(child instanceof Child) //logs false 

Но это делает

var Parent = function(){ 
} 

var Child = function(){ 

} 
Child.prototype = new Parent(); 

var child = new Child(); 

console.log(child instanceof Child) // logs true 

Единственная причина, почему я хочу первый вариант, так что я могу использовать конструктор родителя. Я предполагаю, что this проблема, но я не настолько хорош в javascript. Как это сделать?

+0

Когда вы говорите 'this .__ proto__ = new Parent()' вы говорите «Хорошо новый объект, перестань быть« ребенком » и вместо этого начните «Parent», поэтому неудивительно, что объект больше не является экземпляром Child. – apsillers

+0

@ capsillers - это то, что из-за этого? Почему второй метод не делает то же самое? Это потому, что я не занимаюсь «новым ребенком», когда устанавливаю прототип? –

+0

А теперь я понимаю ваше замешательство; Я уточню свой ответ. – apsillers

ответ

2

Лучший способ сделать это состоит в callParent конструктор на this:

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

Таким образом, код Parent конструктор работает с this набором к this в Child конструктора, но вы не» t изменить __prototype__ от this.

В ваших двух примерах есть экземпляр child, который является структурно одинаковым. Однако, главное отличие в том, что в вашем первом примере, Child.prototype != child.__proto__. Хотя верно, что Child.prototype и child.__proto__ оба объекта с __proto__Parent.prototype, они не являются точно таким же объектом, поэтому instanceof не удается.

Вы можете также хотите сделать так, чтобы Child.prototype = Object.create(Parent.prototype);Child экземпляры имеют доступ к Parent «s метод прототипа. (В настоящее время у вас нет методов на Parent.prototype, но, может быть, вы когда-нибудь будете.)

+0

Это мое намерение иметь общие методы для родителя или его прототипа. –

+0

Не нужно ли устанавливать результат «Parent.call (this)» на что-то на Child? И, это 'Child.prototype = Object.create (Parent.prototype);' replace 'Child.prototype = new Parent(); '? –

+1

@JoshC. Нет, 'Parent.call (this)' стоит сам по себе, потому что он мутирует 'this'. Конструктор 'Parent' делает такие вещи, как' this.foo = 5', поэтому после завершения 'Parent.call (this)' ваш 'this' имеет свойство' foo'. – apsillers

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