2014-02-21 103 views
10

我經常發現自己希望對數組中的所有項目進行某些操作,並希望JavaScript具有類似於C#的LINQ的功能。所以,爲此,我掀起了數組原型的一些擴展:擴展JavaScript中的數組原型

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 

這使得使用數組容易得多,如果你需要做他們一些數學處理。有沒有建議反對使用這樣的模式?我想我應該可以使自己的類型繼承Array的原型,但除此之外,如果這些數組只有數字,那麼這是一個好主意嗎?

回答

5

一般來說you should avoid extending base objects因爲它可能會與該對象的其他擴展衝突。理想情況下,擴展Array,然後修改THAT是最安全的做法,因爲它可以保證不會與其他開發人員發生衝突,他們可能會嘗試做同樣的事情(即使他們不應該這樣做)。

基本上,避免在可能的情況下擴展基礎對象,因爲與擴展數組對象相比,它可能會讓您陷入麻煩中,從而獲得非常小的實際益處。

+2

_「擴展數組,然後修改THAT」_雖然你的答案並不差,但這並不像你想象的那麼容易,除非我錯過了某些東西......) –

+0

哦,這是絕對的不容易,不要誤解我的意思,但這是可行的;一個很好解釋的例子可以在http://www.bennadel.com/blog/2292-Extending-JavaScript-Arrays-While-Keeping-Native-Bracket-Notation-Functionality.htm – moberemk

+0

中看到。問題在於它不是一個真正的數組 - 它只是擁有所有的原型方法。例如,除非使用提供的'add'方法,否則'length'屬性不會像真實數組那樣更新。 –