2013-10-28 59 views
1

在以下語句中,Object#hasOwnProperty()用於檢查當前屬性是否是對象實例的屬性,而不是來自原型鏈。這意味着永遠不會考慮這種情況,for循環將遍歷原型鏈中包含的整個屬性列表。如何查看對象的實例屬性?

for (key in obj) 
    if (obj.hasOwnProperty(key)) { 
    iterator.call(context, obj[key], key); 
    } 
} 

我想知道是否有擺脫這種行爲方式和只有經過一個對象實例的屬性列表?


正如通過標籤所提到的,我主要是問性能利益問題。我正在做這個精度,因爲一個響應提議使用Object#getOwnPropertyNames(),但我看到的所有基準似乎都證明for…inhasOwnPropertygetOwnPropertyNames是相當不利的getOwnPropertyNames。例如:jsperf.com/for-in-vs-object-getownpropertynamesjsperf.com/for-in-vs-getownpropertynames-and-foreach/5

回答

0

Object.getOwnPropertyNames返回直接在給定對象上找到的所有屬性(可枚舉或不可枚舉)的數組。

所以,你可以像這樣的東西替換for循環:

Object.getOwnPropertyNames(obj).forEach(function(key){ 
    iterator.call(context, obj[key], key); 
}); 

http://jsfiddle.net/fL2gH/

+0

謝謝!事情是,我看到的所有基準似乎都證明'for ... in' with'hasOwnProperty'與'getOwnPropertyNames'對於'getOwnPropertyNames'非常不利。例如:http://jsperf.com/for-in-vs-object-getownpropertynames或http://jsperf.com/for-in-vs-getownpropertynames-and-foreach/5 –

相關問題