2013-06-21 28 views
2

我工作的一個項目中,數組原型有新的方法添加:JavaScript數組的原型 - 新的方法添加 - 奇怪的console.log

Array.prototype.addOrRemove = function(value) { 
    var index = _.indexOf(this, value); 

    if (index === -1) { 
     this.push(value); 
    } else { 
     this.splice(index, 1); 
    } 
    return this; 
}; 

它要麼增加了新的價值(如果它不存在數組中)或刪除它(否則)。奇怪的是,當我鍵入:

console.log([]); 

我得到下面的輸出(在Chrome JS控制檯):

[addOrRemove: function] 

我以爲只有值應該是存在於這樣的控制檯日誌。我做錯了什麼或者是一種正常的行爲(反正看起來很奇怪)?我會很感激一些解釋。

+0

看起來正常的我。 –

+0

這很好,它只是告訴你爲了方便而添加的自定義方法,如果你進一步考慮,你會看到'length:0'。無論如何,如果您使用Underscore,則無需使用該功能來擴展原型。 – elclanrs

+0

@elclanrs是的,我正在使用下劃線。你能解釋我怎麼用_而不是擴展數組原型?爲什麼_優於重寫原型? – ducin

回答

5

您可以使用defineProperty,默認情況下它使屬性不可枚舉。

Object.defineProperty(
    Array.prototype, 
    'addOrRemove', 
    { 
     get: function() { 
      return function(value) { 
       var index = _.indexOf(this, value); 

       if (index === -1) { 
        this.push(value); 
       } else { 
        this.splice(index, 1); 
       } 
       return this; 
      }; 
     } 
    } 
); 

console.log([]); 

http://jsfiddle.net/qHFhw/1/