2013-02-13 82 views
3

我想用額外的方法返回一個數組。我平時做這樣的事情:使用原型來創建一個包含方法的數組

MyConstructor = function(a, b, c){ 
    var result = [a, b, c]; 
    result.method1 = function(){ 
     return a + b + c ; 
    } 
    return result ; 
} 

var obj = MyConstructor(2, 4, 6); // removed `new` 

但隨着方法的數量和用途成長,我相信它會更容易維護(和更有效),而不是使用定義這些新的(相同的)原型匿名每次都起作用,但是如果沒有以Array.prototype結尾的方法,我找不到這種方法。

這是可能的,如果是這樣,如何?

+0

1)你的代碼是一個工廠方法,'new'關鍵字對它毫無意義。 2)#1使得使用原型鏈沒有意義。 – Shmiddty 2013-02-13 18:19:21

+1

http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/ – Bergi 2013-02-13 18:27:55

+0

謝謝。但即使沒有它,我也無法將方法放在返回對象的原型上。 – ColBeseder 2013-02-13 18:28:17

回答

2

一種方法是使用包裝對象,如由Shmiddty答案。

或者,如果你不想使用的包裝,但要直接修改數組,你可以只增加它:

// Define some special methods for use 
var specialMethods = { 
    sum: function() { 
    var i = 0, len = this.length, result = 0; 
    for (i; i < len; i++) result += this[i]; 
    return result; 
    }, 
    average: function() { 
    return this.sum()/this.length; 
    } 
}; 

function specialize(array) { 
    var key; 
    for (key in specialMethods) { 
    if (specialMethods.hasOwnProperty(key)) { 
     array[key] = specialMethods[key]; 
    } 
    } 
    return array; 
} 

var arr = specialize([1, 2, 3, 4, 5]); 
console.log(arr.sum()); // 15 
console.log(arr.average()); // 3 

這樣,你不要碰Array.prototype並得到補充你的方法而不必一遍又一遍地重新定義它們。但是請注意,它們會被複制到每個數組中,因此存在一些內存開銷 - 它不會執行原型查找。

另外,請記住,你總是可以只定義在數組操作功能:

function sum(array) { 
    var i = 0, len = array.length, result = 0; 
    for (i; i < len; i++) result += array[i]; 
    return result; 
} 

你沒有得到的somearray.sum()語法糖,但sum功能只會被定義一次。

這一切都取決於你需要什麼。

+0

語法sugar是練習的全部要點!這種方法對我所擁有的東西是一個很好的改進。 Bergi發佈了一個不錯的鏈接,但這些解決方案並不適合我的需求。 – ColBeseder 2013-02-17 10:37:53

2

修改你的榜樣,以允許與原型鏈使用應該是這樣的:

// this could still be var MyConstructor = function... 
// but I prefer this form for Classes 
function MyConstructor(a, b, c){ 
    this.result = [a, b, c]; 
} 

MyConstructor.prototype.method1 = function(){ 
    // Array.reduce can be used for summation, or you could hardcode something like: 
    // return this.result[0] + this.result[1] + this.result[2] 
    // or do a summation through a for-loop, etc 
    return this.result.reduce(function(a,b){return a+b}); 
} 

var obj = new MyConstructor(2, 4, 6); 
console.log(obj.result, obj.method1()); // [2, 4, 6] 12 
+0

但是現在,console.log(obj [0])不顯示2 – ColBeseder 2013-02-17 10:24:12