为什么不't loadash/aunderline将util方法放在数组原型上

why don't loadash/underscore put the util method on array prototype?

本文关键字:方法 util 数组 原型 aunderline loadash 为什么不      更新时间:2023-09-26

为什么util方法没有把eachmap等函数放在数组原型上?

下划线_使我的代码变长了?那不是更整洁吗?

或者我错过了什么?

你必须询问最初的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>