Наследование прототипа, почему экземпляр, а не прототип? - PullRequest
17 голосов
/ 06 декабря 2010

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

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), но я не совсем уверен.Кто-нибудь хочет меня просветить?

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

Ответы [ 2 ]

18 голосов
/ 06 декабря 2010

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

Cat.prototype = Animal.prototype;

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

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

4 голосов
/ 05 октября 2012

ОПАСНОСТЬ !!!

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

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

Обновление:

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

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

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

...