Обычно я видел функции прототипа, объявленные вне определения класса, например:
function Container(param) {
this.member = param;
}
Container.prototype.stamp = function (string) {
return this.member + string;
}
var container1 = new Container('A');
alert(container1.member);
alert(container1.stamp('X'));
Этот код создает два предупреждения со значениями "A" и "AX".
Я хотел бы определить функцию прототипа INSIDE определения класса. Что-то не так с этим?
function Container(param) {
this.member = param;
if (!Container.prototype.stamp) {
Container.prototype.stamp = function() {
return this.member + string;
}
}
}
Я пытался это сделать, чтобы получить доступ к частной переменной в классе. Но я обнаружил, что если моя прототипная функция ссылается на частный var, значение private var всегда является значением, которое использовалось, когда функция прототипа была ИНИЦИАЛЬНО создана, а не значение в экземпляре объекта:
Container = function(param) {
this.member = param;
var privateVar = param;
if (!Container.prototype.stamp) {
Container.prototype.stamp = function(string) {
return privateVar + this.member + string;
}
}
}
var container1 = new Container('A');
var container2 = new Container('B');
alert(container1.stamp('X'));
alert(container2.stamp('X'));
Этот код создает два предупреждения со значениями "AAX" и "ABX". Я надеялся, что выход будет "AAX" и "BBX". Мне любопытно, почему это не работает, и если есть другой шаблон, который я мог бы использовать вместо этого.
РЕДАКТИРОВАТЬ: Обратите внимание, что я полностью понимаю, что для этого простого примера было бы лучше всего использовать закрытие, подобное this.stamp = function() {}
, и вообще не использовать прототип. Вот как я это сделаю. Но я экспериментировал с использованием прототипа, чтобы узнать больше об этом и хотел бы знать несколько вещей:
- Когда имеет смысл использовать функции прототипа вместо закрытия? Мне нужно было использовать их для расширения существующих объектов, например
Date
. Я читал, что закрытия быстрее. - Если мне по какой-то причине нужно использовать функцию прототипа, "ОК", чтобы определить ее внутри класса, как в моем примере, или он должен быть определен за пределами?
- Я хотел бы понять, почему значение privateVar для каждого экземпляра недоступно для функции прототипа, только значение первого экземпляра.