Javascript prototype.function与this.function的对比
老问题,问了很多次,回答了很多次,但有点扭曲。首先,原型版本:Javascript prototype.function与this.function的对比,javascript,Javascript,老问题,问了很多次,回答了很多次,但有点扭曲。首先,原型版本: someA = function() { this.val = 'a'; } someA.prototype.getVal = function() { return this.val; } 另一个版本: someA = function() { this.val = 'a'; this.getVal = function() { return this.val; } }
someA = function() {
this.val = 'a';
}
someA.prototype.getVal = function() {
return this.val;
}
另一个版本:
someA = function() {
this.val = 'a';
this.getVal = function() {
return this.val;
}
}
现在,假设getVal()函数是巨大的,您将创建数千个someA对象,但是出于任何原因,您想使用this.getVal版本吗?如果我们这样写呢:
someA =function() {
this.val = 'a';
this.getVal = this._getVal;
}
someA.prototype._getVal = function() {
return this.val;
}
这样做的话,你会从本质上同时拥有这两者的优势吗
p、 在一个完全不同(但仍然有些相关)的话题上,如何在问题或答案中添加问题和评论
编辑:将所有发生的
返回val
更改为返回此.val
--哑错误;-) 您只是对原型函数进行了别名处理,没有任何好处。在别处定义的函数在指定给某个对象时不会意识到任何变量。它的作用域中不会突然出现val
但是,无论函数定义在何处,函数每次调用都可以有不同的对象上下文。这允许对不同对象进行真正的函数重用,而不需要将所有内容都保存在巨大的闭包链中,然后为每个对象重新创建它们
您可以尝试运行代码以查看它是否不起作用:
someA =function() {
var val = 'a';
this.getVal = this._getVal;
}
someA.prototype._getVal = function() {
return val; //This will throw reference error because the `val` is not
//known here.
}
这样做真的没有意义 有些人可能会争辩说,原型版本将节省内存,并提供稍好的性能。这可能是真的,虽然您可以尝试在jsPerf设置一个测试,看看您得到了什么结果,但可能还不足以产生显著的差异 这两者之间当然有区别。原型将只创建属性或方法的一个实例,构造函数将创建尽可能多的对象实例
我会说,只要你觉得有意义就去做,或者两者结合。如果您真的关心性能,那么使用构造函数添加可能更改的属性或每个实例必须唯一的属性,并使用原型创建适用于所有实例的公共方法。下面的示例之所以有效,是因为
getVal
函数处于闭包中,将外部函数中作用域中的所有变量保留在作用域中,因此,创建运行someA
的实例后,将为您提供一个对象,该对象具有一个方法getVal
,可以访问val
的值
var someA = function() {
var val = 'a';
this.getVal = function() {
return val;
}
};
如果将val作为成员变量公开(即:this.val='a';
),则需要getVal
方法也返回成员变量版本,而不仅仅是返回val代码>
var someA = function() {}
someA.prototype = {
val: 'a',
getVal: function() {
return this.val;
}
};
使用原型意味着这在功能上与:
var someA = function() {
this.val = 'a';
this.getVal = function() {
return this.val;
}
}
但由于getVal函数只有一个实例,因此具有显著的性能提升。但是,您可以通过将单个函数实例重写为以下内容来使用具有多个引用的单个函数实例:
var _getVal = function() {
return this.val;
};
var someA = function() {
this.val = 'a';
this.getVal = _getVal;
}
我想你想把val
设为私有。到目前为止,val
仍然是公共的。代码中也有一些错误。您不能仅用val
引用this.val
。这是一条注释。只需点击下面的“添加评论”。同样的事情answers@bennedich这就是我在凌晨3点发帖的结果。将代码更改为返回this.val
\u getVal
本应返回this.val
。我的错误。当然,重复使用是我这次讨论的目的。@JohnFrickson在这种情况下,绝对没有区别。您只需添加一个冗余别名。它将在没有任务的情况下正常工作,在有任务的情况下正常工作。没关系。