保存对内置方法的引用的好处
benefits of saving reference to built-in methods
ap = Array.prototype,
aps = ap.slice,
apsp = ap.splice,
我经常在不同的框架中看到类似的代码。这样做的好处是什么?为什么不直接使用呢? 当完全按照您所展示的方式使用时,主要原因是为了减少代码中大量使用所引用的方法或对象的键入量。此外,这可以减少脚本的总体大小。考虑:
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);
几个好处:
- 运行时更快(获得最终结果的查找次数更少)
- 缩小前更小的代码
- 通过缩小更容易减少
- 编码时少输入
需要注意的是,我认为对于不熟悉代码或其约定的人来说,它使代码可读性降低,因为代码不是自文档化的。每个人都知道Array.prototype.splice
是什么,但是陌生人不知道aps
是什么,直到他们研究代码,追踪它的定义并记住它是什么。
有人在评论中要求我解释查找次数减少的问题:
对于解释器解析Array.prototype.splice
,它必须做以下操作:
- 在本地范围中查找
Array
名称。它找不到它。 - 查看任何闭包(例如父作用域)中
Array
的名称。它找不到它。 - 在全局作用域中查找
Array
名称。它找到它。 - 在
Array
对象上,查找prototype
属性。 - 在
prototype
属性上,寻找splice
属性,现在它终于有了它需要的功能。
对于解释器解析aps
,它必须这样做:
- 在本地范围中查找
aps
名称。它找到它,而不是它有它需要的功能。
对aps
的预赋值实际上已经预先完成了查找,因此它们已经在运行时解决了。这减少了一些灵活性,因为如果splice或prototype属性的值被更改,变量aps
将不会反映该更改,但是如果您知道它们不应该更改(运行时解释器不知道的事情),那么您可以利用这个快捷方式。
这种模式存在的一个功能原因是防止其他javascript代码更改特定方法的含义。从本质上保护不受如下代码的影响
Array.prototype.splice = function() {
// This is evil
};
另一种更可能的情况是,开发者只是不想输入Array.prototype.splice
,而更喜欢apsp
这样的短版本。
有两个好处。
-
a
比Array.prototype.slice
更容易缩小 -
a
是单次查找,Array.prototype.slice
是多次查找
所以基本上它们都是微优化。这在图书馆中很有价值因为图书馆关心的是尽可能的高效
相关文章:
- 引用类变量中的原型方法
- 有没有一种方法可以通过只引用JavaScript来执行代码
- 可以“;超级“;可以在子类的方法内部使用,在不直接引用的情况下调用相应的超类方法
- 通过引用Javascript中的另一个函数来传递对象方法
- 这在 Object 方法中不引用对象,而是引用函数绑定到的标记
- 在方法中失去对对象的引用
- 使用clearInterval方法实现的是将区间变量引用设置为null,而不是
- 有没有一种方法可以捕获JavaScript控制台输出,以便我可以在其他地方引用它
- 有没有一种方法可以重新绑定jQuery插件中引用的事件处理程序
- 在JQuery中,'加载'方法'的相对路径在引用项目中的html文件时开始
- 可以't从客户端应用程序引用插件中定义的静态方法
- 更好的设计,以便从对象的方法引用自己的对象的属性
- 为什么Javascript库对数组方法(push,slice等)有本地引用
- 模仿通过引用而不是值将数字传递给函数的任何方法
- 从充当事件处理程序的多个方法引用对象属性
- 在 javascript 中将“this”引用传递给方法的提示
- Java Nashorn中的(De)引用方法变体
- 在 JavaScript 中,如何从更深层次的嵌套方法引用方法的返回值
- 如何从对象中引用方法
- 在init之前引用方法