2013-07-13 137 views
1

我一直在尋找一個克隆對象的功能在這裏:迭代對象和hasownproperty

http://jsperf.com/cloning-an-object/2

的功能是:

function clone(obj) { 
    var target = {}; 
    for (var i in obj) { 
     if (obj.hasOwnProperty(i)) { 
      target[i] = obj[i]; 
     } 
    } 
    return target; 
} 

,我想知道爲什麼是檢查

if (obj.hasOwnProperty(i)) 

需要嗎?

因爲如果物業的對象OBJ不是,它不會被擺在首位迭代的循環。

我錯過了什麼嗎?

+4

可以從原型繼承。 – Tim

回答

3

for...in構造還循環播放繼承的屬性。

如果創建一個構造方法的對象,例如像這樣:

var s = new String(); 

那麼你的屬性中列出的所有枚舉String功能,但不能作爲自己性能(即直接屬性)。例如試試這個控制檯:

for (var k in s) console.log(k) 

你會發現,很可能是必不可少的,因此開發人員喜歡formatUnicorn一些有趣的功能。

該檢查讓您克隆直接可枚舉的屬性而無需克隆原型屬性。

參見documentation on the MDN

+1

umm ...所有*可枚舉*函數。哪些不是很多。 –

+0

@JanDvorak你添加的每個函數都是可枚舉的,有時 - 特別是在較早的實現中,你可能想要使用hasOwnPropertyName來過濾原型上的東西。 –

+0

@BenjaminGruenbaum是的,但大多數功能是預先存在的,因此不能枚舉。絕對不是「所有字符串函數」都是可枚舉的。 –

1

因爲原始循環還會顯示原型對象的屬性,您不希望這樣做。