Подтвердить что ты не робот

Наследование прототипа, почему экземпляр, а не прототип?

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

var Animal = function(type){
    this.type = type;
}
Animal.prototype.getType = function(){
    return this.type;
}
var Cat = function(options){
    this.breed = options.breed;
}

//Inheritance
Cat.prototype = new Animal('Cat');

Почему бы не сделать такое наследование?

Cat.prototype = Animal.prototype;

Мое предположение заключается в том, что, только наследуя прототип, вы не включаете свойства, созданные в конструкторе (this.type), но я не совсем уверен. Кто-нибудь хочет просветить меня?

Но не помещает ли экземпляр в прототип дочернего класса, помещая все конструктор-определенные свойства в прототип и тем самым вводя возможные подводные камни? Я думаю о том, что свойства прототипа разделяются между всеми экземплярами класса, если они не определены в конструкторе.

4b9b3361

Ответ 1

Ну, не задумываясь об этом, если принять последний подход, то цепочка прототипов на самом деле не будет. Например, допустим, что Animal наследуется от Entity. Тогда Animal.prototype будет своего рода указателем на Entity - и затем

Cat.prototype = Animal.prototype;

установит прототип для Cat к прототипу того же, что и Animal (т.е. некоторая ссылка Entity). Это могло бы привести к тому, что Cat станет родным братом Animal, а не ребенком, как предполагалось.

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

Ответ 2

ОПАСНО!!!

Если вы назначаете прототип, то они являются одним и тем же объектом, любое изменение в Cat.prototype изменит Animal.prototype

function Animal() { }
function Cat() { }
Cat.prototype = Animal.prototype;
Cat.prototype.legs = 4;
console.log(new Animal().legs + "!!"); // 4!!

Update:

Кстати, чтобы сделать полное наследование, вы также должны наследовать конструктор, называя его внутри родителя:

function Animal() {
    this.onDie = new Signal();
}
function Cat() {
    Animal.call(this);
   // do your stuff here...
}
Cat.prototype = new Animal();

Если вы не получите свойства, которые конструктор вводит в экземпляры как "onDie" в этом случае.