为什么不't loadash/aunderline将util方法放在数组原型上
why don't loadash/underscore put the util method on array prototype?
为什么util方法没有把each
、map
等函数放在数组原型上?
下划线_
使我的代码变长了位?那不是更整洁吗?
或者我错过了什么?
你必须询问最初的Undercore开发人员,但我能想到几个原因:
可枚举性问题
当Underscore于2009年首次发布时,第5版JavaScript规范只有,只有,并且没有得到广泛实现。正是这个规范使向对象添加不可枚举的属性成为可能;在此之前,向对象添加属性意味着它们会出现在for-in
循环中。这会输出"foo",例如:
Array.prototype.foo = function() {};
for (var k in []) {
console.log(k);
}
示例:
Array.prototype.foo = function() {};
for (var k in []) {
log(k);
}
function log(msg) {
var p = document.createElement('p');
p.appendChild(document.createTextNode(msg));
document.body.appendChild(p);
}
从ES5开始,可以这样做:
Object.defineProperty(Array.prototype, "foo", {
value: function() { }
});
这使得foo
属性不可枚举(没有出现在for-in
循环等中),但同样,当Undercore出现时,这是全新的。
很多人使用for-in
来循环遍历数组,即使没有保护措施也不应该这样做。因此,他们决定不扩展内置原型,而不是破坏大量的代码。
冲突
即使没有可枚举性问题,在通用库中扩展内置原型也不一定是个好主意。Underscore可以想出的任何有用功能的名称都可能很容易被TC-39委员会在未来版本的JavaScript中使用,从而引发冲突。
清晰度
将它们放在_
上可以清楚地表明,您使用的是Undercore,而不是JavaScript数组的内置功能。
对其他类型对象的实用程序
许多Undercore方法可以处理任何类似的数组,而不仅仅是数组。使这些方法在_
而不是Array.prototype
上可用,使它们在非数组上的使用更加简单。例如,考虑_.pluck
,它可以方便地处理DOM元素集合(类似数组,但不是数组):
var values = _.pluck(document.querySelectorAll("input"), "value");
示例:
var values = _.pluck(document.querySelectorAll("input"), "value");
var p = document.createElement('p');
p.appendChild(document.createTextNode(values.join(", ")));
document.body.appendChild(p);
<input type="text" value="one">
<input type="text" value="two">
<input type="text" value="three">
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- toBoolean方法类似于toString
- 如何在单击复选框后调用控制器方法
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 递归使用 eval() 是检查程序执行的好方法吗?
- 如何在webView,Android中从@JavascriptInterface方法调用Javascript
- 为什么不't loadash/aunderline将util方法放在数组原型上
- 如何使用 util 将方法添加到模块 express() 中
- 创建一个javascript"hasValue”;util方法
- 为什么要在' util.inherits '之后添加原型方法?