Уже существует множество потоков о прототипном наследовании в JavaScript, но это не копия из-за лени. Я буквально прочитал их все и нашел почти столько разных синтаксических подходов, сколько нашел ответы, так что кажется, что я не единственный, кто путается по этому вопросу!Правильный способ реализации прототипального наследования
Особенности:
Мой текущий подход выглядит следующим образом.
var Person = function(name) {
this.name = name;
this.greeting = function() {
alert("Greetings, I am " + name);
}
}
var bob = new Person("bob");
bob.greeting();
var Woman = function(name) {
Person.call(this, name);
this.gender = "female";
}
Woman.prototype = Object.create(Person.prototype);
var brenda = new Woman("brenda");
brenda.greeting();
Person.prototype.eats = true;
alert(brenda.eats);
Проверив код я нашел это отлично работает - насколько я могу сказать, - но мне сказали, что это не самый лучший подход, и что я должен определить конструктор, как это:
Woman.prototype.constructor = Woman;
И не используйте метод Person.call в моем методе фактического конструктора. Две вещи, когда мне сказали, что я не вижу простого способа передать параметры с помощью второго подхода, а также, почему? То, что я делаю, кажется, работает нормально.
Я что-то упустил?
Есть ли случаи, когда то, что я делаю, даст непредсказуемые ошибки?
Может ли кто-нибудь дать окончательный «правильный» подход и причину этого?
'prototype.call'? Вы имели в виду 'Person.call'? – thefourtheye
Я думаю ... и я мог ошибаться здесь, что метод вызова принадлежит Object.prototype и наследуется. Так Person.call является сокращением для Person.prototype.call() .. так вот что я считаю. –
FYI, 'Person.call' - это не то же самое, что' Person.prototype.call'. 'Person.protoype' не является функцией, его нельзя назвать. –