保存对内置方法的引用的好处

时间:2011-09-20 16:05:22

标签: javascript reference

 ap = Array.prototype,
 aps = ap.slice,
 apsp = ap.splice,

我经常在不同的框架中看到上面的代码。这有什么好处? 为什么不直接使用它?

4 个答案:

答案 0 :(得分:3)

如果完全按照您的使用方式使用,主要原因是减少将大量使用引用的方法或对象的代码中的键入量。此外,这可以具有减小脚本的整体大小的效果。考虑:

Array.prototype.someFunction1 = function () { /*someFunction1 */ };
Array.prototype.someFunction2 = function () { /*someFunction2 */ };
Array.prototype.someFunction3 = function () { /*someFunction3 */ };
Array.prototype.someFunction4 = function () { /*someFunction4 */ };

...(284个字符)与:

var ap = Array.prototype;
ap.someFunction1 = function () { /*someFunction1 */ };
ap.someFunction2 = function () { /*someFunction2 */ };
ap.someFunction3 = function () { /*someFunction3 */ };
ap.someFunction4 = function () { /*someFunction4 */ };

...有261个字符。琐碎,是的,但是在大规模上,这可以在分布式代码中产生足够的差异(想想Google托管的jQuery)。

然而,有时这样做是为了通过闭包保留范围:

  var self = this;
  this.someProperty = 5;
  var myDiv = document.createElement('div');
  myDiv.addEventListener('mousedown', function(e) { alert(self.someProperty); }, false);

答案 1 :(得分:2)

有几个好处:

  1. 在运行时更快(获得最终结果的查找次数减少)
  2. 缩小前的较小代码
  3. 缩小更容易减少更多
  4. 编码时输入较少
  5. 我应该注意到,我认为这使代码对于不熟悉代码或其约定的人来说更不易读,因为代码不是自我记录的。每个人都知道Array.prototype.splice是什么,但陌生人不知道aps是什么,直到他们研究代码,追踪其定义并记住它是什么。


    我在评论中被问到解释查找次数较少的问题:

    要让口译员解决Array.prototype.splice,必须执行以下操作:

    1. 查看Array名称的本地范围。它找不到它。
    2. 查看Array名称的任何闭包(例如父作用域)。它找不到它。
    3. 查看Array名称的全局范围。它找到了它。
    4. Array对象上,查找prototype属性。
    5. prototype属性上,查找splice属性,现在它最终具有所需的功能。
    6. 要让口译员解决aps,必须这样做:

      1. 查看aps名称的本地范围。它找到它而不是它具有它所需的功能。
      2. aps的预分配基本上预先完成了查找,因此它们已在运行时解析。这消除了一些灵活性,因为如果更改了splice或prototype属性的值,变量aps将不会反映该更改,但是如果您知道它们不应该更改(运行时解释器不会不知道,然后你可以利用这个捷径。

答案 2 :(得分:1)

这种模式存在的一个功能原因是防止其他javascript代码改变特定方法的含义。基本上保护代码如下

Array.prototype.splice = function() {
  // This is evil
};

另一个更可能的是,开发人员根本不想输入Array.prototype.splice并且更喜欢像apsp这样的较短版本。

答案 3 :(得分:0)

有两个好处。

  • aArray.prototype.slice
  • 更容易缩小
  • a是单个查找,其中Array.prototype.slice是多个查找

所以基本上它们都是微观优化。这对图书馆很有价值,因为图书馆关心的是尽可能高效