У меня есть вопрос о JS прототипирования:Наследование прототипа на основе кода JavaScript отличается от другого?
Если у меня есть следующий конструктор:
function Person(name) {
if (!(this instanceof Person))
return new Person(name);
this.name = name;
}
Person.prototype.sayHello = function() {
console.log("Hello from " + this.name);
}
Здесь у меня есть метод sayHello
связанный с прототипом Человека, который больше памяти эффективным, что это:
function Person(name) {
if (!(this instanceof Person))
return new Person(name);
this.name = name;
this.sayHello = function() {
console.log("Hello from " + this.name);
}
}
Только проблеск:
прототипичный лицо:
Не-прототипичный человек:
Как вы видите, ссылка на sayHello
Функция будет "общий" по всей личности, сотворенной, вместо того, чтобы просто создать новая функция для каждого созданного экземпляра. this
затем будет мутировать, чтобы указать правильному человеку, когда он используется внутри контекста sayHello()
, когда sayHello()
вызывается на , что конкретное лицо.
Теперь другой вариант:
function Person(name) {
if (!(this instanceof Person))
return new Person(name);
this.name = name;
this.__proto__.sayHello = function() {
console.log("Hello from " + this.name);
}
}
И выход такой же, как для Person.prototype.sayHello
, а это означает, что sayHello
распределяется между различными лицами.
Но есть ли разница между этими двумя подходами? не я думаю, нет, потому что:
Person.prototype === bob.__proto__ // true
Так на самом деле, когда нужно использовать прежний (Person.prototype.*
вне функции конструктора) вместо последнего (this.__proto__.*
внутри функции конструктора)?
** вероятно, не ответ, просто ссылка цели ** - Вы уже проверили эти хорошие вопросы? 1: http://stackoverflow.com/questions/572897/how-does-javascript-prototype-work?rq=1 - 2: http://stackoverflow.com/questions/2064731/good-example-of-javascripts -prototype-based-inheritance? rq = 1 – briosheje
Всегда! Почему вы хотите каждый раз мутировать прототип *, вызываемый конструктором? Несмотря на то, что метод (ы) все равно будет использоваться совместно, каждый вызов конструктора создает новую версию метода и отбрасывает старый. Просто создайте метод один раз и сделайте с ним. –
@FelixKling Это хорошая причина, но помимо этого нет никаких других различий, верно? – tonix