【发布时间】:2011-02-16 14:38:32
【问题描述】:
通常,我见过在类定义之外声明的原型函数,如下所示:
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;
}
}
}
我正在尝试这样做,以便我可以访问类中的私有变量。但我发现,如果我的原型函数引用了一个私有 var,那么私有 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。我读过closures are faster。 - 如果我出于某种原因需要使用原型函数,是否可以像在我的示例中那样在类内部定义它,还是应该在外部定义它?
- 我想了解为什么原型函数无法访问每个实例的 privateVar 值,只能访问第一个实例的值。
【问题讨论】:
-
停业再次袭来……
-
阅读闭包 (jibbering.com/faq/faq_notes/closures.html) 了解代码行为方式的详细原因。
标签: javascript oop prototype