prototype.function vs this.function with a twist

时间:2012-08-06 07:23:09

标签: javascript

老问题,多次询问和回答,但有点扭曲。首先是原型版本:

someA = function() {
    this.val = 'a';
}
someA.prototype.getVal = function() {
    return this.val;
}

现在是另一个版本:

someA = function() {
    this.val = 'a';
    this.getVal = function() {
        return this.val;
    }
}

现在,假设getVal()函数是 HUGE ,你将创建someA的数千个对象,但无论出于何种原因,你想使用this.getVal版本?如果我们这样写的话会怎么样:

someA =function() {
    this.val = 'a';
    this.getVal = this._getVal;
}
someA.prototype._getVal = function() {
    return this.val;
}

这样做,你基本上可以获得两者的优势吗?

P.S。在一个完全不同(但仍然有些相关)的主题上,如何在问题或其中一个答案中添加问题和评论

已编辑:return val的所有出现更改为return this.val - 愚蠢的错误; - )

3 个答案:

答案 0 :(得分:0)

你只是对原型函数进行别名,没有任何好处。在将其分配给某些内容时,其他地方定义的函数不会发现任何变量。它的范围不会突然变为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.
}

答案 1 :(得分:0)

做这个IMO真的没有意义。

有些人可能会争辩说原型版本会为你节省内存并为你提供更好的性能。这可能是真的,可能还不足以产生显着差异,尽管你可以尝试在jsPerf设置一个测试并看看你得到了什么结果。

两者之间当然有区别。原型只会创建一个属性或方法实例,构造函数将创建与对象实例一样多的实例。

我会说,只要对你有意义或两者结合起来。如果您真的关心性能,那么使用构造函数添加可能更改的属性或每个实例必须唯一的属性,并使用原型创建适用于所有实例的公共方法。

答案 2 :(得分:0)

以下示例的工作原理是,getVal函数位于闭包中,将外部函数中范围内的所有变量保留在范围内,因此创建了一个运行{{1}的实例。 1}}为您提供一个方法someA的对象,该方法可以访问getVal的值。

val

如果您将val作为成员变量公开(即:var someA = function() { var val = 'a'; this.getVal = function() { return val; } }; ),那么您需要this.val = 'a';方法也返回成员变量版本,而不仅仅是getVal。< / p>

return val;

使用原型意味着它在功能上与:

相同
var someA = function() {}
someA.prototype = {
  val: 'a',
  getVal: function() {
    return this.val;
  }
};

但由于只有一个getVal函数实例,所以性能显着提升。但是,您可以通过将其重写为:

来使用具有多个引用的单个函数实例
var someA = function() {
  this.val = 'a';
  this.getVal = function() {
    return this.val;
  }
}