在JavaScript中扩展Array原型

woo*_*gie 14 javascript

我经常发现自己想要对数组中的所有项进行某些操作,我希望JavaScript有类似C#的LINQ.所以,为此,我掀起了Array原型的一些扩展:

var data = [1, 2, 3];
Array.prototype.sum = function () {
    var total = 0;
    for (var i = 0; i < this.length; i++) {
        total += this[i];
    }
    return total;
};
Array.prototype.first = function () {
    return this[0];
};
Array.prototype.last = function () {
    return this[this.length - 1];
};
Array.prototype.average = function () {
    return this.sum() / this.length;
};
Array.prototype.range = function () {
    var self = this.sort();
    return {
        min: self[0],
        max: self[this.length-1]
    }
};
console.log(data.sum()) <-- 6
Run Code Online (Sandbox Code Playgroud)

如果您需要对它们进行一些数学处理,这使得使用数组变得更加容易.是否有任何建议反对使用这样的模式?我想我应该创建自己继承自Array的原型的类型,但除此之外,如果这些数组中只有数字,这是一个好主意吗?

mob*_*emk 5

一般来说,您应该避免扩展基础对象,因为它可能与该对象的其他扩展冲突.理想情况下,扩展Array然后修改THAT是最安全的做事方式,因为它可以保证不会与其他可能尝试做同样事情的开发人员发生冲突(即使他们不应该).

基本上,尽可能避免扩展基础对象,因为与扩展数组对象相比,它可能会让您陷入麻烦,实际上没什么好处.

  • _"扩展数组,然后修改那个"_虽然你的答案并不坏,但这并不像你想象的那么容易,除非我错过了什么......;) (2认同)
  • 这似乎是扩展数组对象的一种非常复杂的方式。我只会使用像 `arrayExt = function(array = []){array.method = () =&gt; 'method'; 这样的工厂。返回数组}` (2认同)
  • 为什么不?如今,从基础对象进行扩展是很常见的。这确实是一个警告(通常不是一个大的“否”情况)。我确实同意它可能与该对象的其他扩展发生冲突。自定义扩展的开发人员有责任确保它不会与任何其他扩展发生任何冲突。只要它符合您的目的和要求,为什么不呢? (2认同)
  • 先生,这就像吃饭时对切面食的人咆哮一样,太严格了。但您认为您拥有避免扩展基本 Javascript 对象的所有权利,我尊重这一点。环顾四周,我们有很多 Javascript 框架(jQuery、Angular)和转译器(CoffeeScript、TypeScript),它们本质上是从基础对象扩展一些东西。谁知道将来有人可能会创建另一个带有 $ 符号的 Javascript 框架,并且它也可能与 jQuery 发生冲突?Javascript 的创建就像 Python 一样灵活。 (2认同)