2014-09-29 33 views
3

這裏有些奇怪。我已經定義了一個自定義的原型方法object稱爲getSizejavascript - 自定義對象原型方法在數組循環中變成索引

if (!Object.prototype.getSize) { 
    Object.prototype.getSize = function() { 
     var size = 0, key; 
     for (key in this) { 
      if (this.hasOwnProperty(key)) size++; 
     } 
     return size; 
    }; 
} 

它給你的對象的大小。到目前爲止很簡單,對嗎? 此處,我會感到困惑:

var l = ["foo", "bar"] 
for (var i in l) { 
    console.log(i); 
} 

結果是:

0 
1 
getSize 

爲什麼getSize有???

編輯 我知道,在JavaScript中數組是對象了。我的問題是爲什麼該方法轉化爲索引,而不是保留一種方法。它對我沒有任何意義...

回答

4

因爲getSize是一個枚舉屬性,你可以定義它是不可枚舉:

Object.defineProperty(Object.prototype, 'getSize', { 
    enumerable: false, 
    value: function() { 
    var size = 0, key; 
    for (key in this) { 
     if (this.hasOwnProperty(key)) size++; 
    } 
    return size; 
    } 
}); 

但你也可以這樣做:

Object.keys(object).length; 
+0

我不知道方法有一個'enumerable'定義。這非常酷,謝謝你的回答!從現在起 – yuvi 2014-09-29 08:42:25

+0

btw,Object.keys(l)''返回'['0','1']'[即使我沒有],我將使用'defineProperty'(http://jsfiddle.net/ yuvii/qwcctogs /)set'enumerable:false' - 怎麼回事? – yuvi 2014-09-29 08:46:59

+0

@yuvi因爲'Object.keys'不使用原型鏈。所有這些東西在[MDN]上都有詳細記錄(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)。 – 2014-09-29 08:52:48

3

因爲["foo", "bar"]也是JavaScript中的對象。嘗試在控制檯中運行typeof ["foo", "bar"]。它將返回"object"給你。所以你也擴展了Arrays方法。完成此操作後,您還需要在所有for..in迭代中檢查hasOwnProperty

這發生在所有global objects在JavaScript

+0

我知道數組也是對象。但爲什麼它不繼承這個方法,爲什麼它變成了一個索引?這沒有任何意義 – yuvi 2014-09-29 08:33:30

+1

elclanrs回答這個問題。你可以在MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties – antyrat 2014-09-29 08:39:24

+0

瞭解更多關於枚舉的信息。謝謝。該鏈接很好 – yuvi 2014-09-29 08:41:10

相關問題