通常,我看到原型函数在类定义之外声明,就像这样:
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"。
我想在类定义内部定义原型函数。这样做有什么问题吗?
function Container(param) {
this.member = param;
if (!Container.prototype.stamp) {
Container.prototype.stamp = function() {
return this.member + string;
}
}
}
我试图这样做,以便能够访问类中的一个私有变量。但是我发现如果我的原型函数引用了一个私有变量,那么私有变量的值始终是在创建原型函数时使用的值,而不是对象实例中的值:
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
。我已经阅读到了闭包更快的文章。 - 如果需要使用原型函数,将其定义在类内部,例如我的示例中那样,是否可以“OK”,还是应该在外部定义?
- 我想了解为什么每个实例的私有变量值对原型函数不可访问,只有第一个实例的值可以访问。