2017-06-17 60 views
3

我有下面的代碼。爲什麼我們總是需要檢查一個對象是否有鍵? - JS

var obj = { 
    name : 'Krysten', 
    age : 33, 
    hasPets : false 
}; 

function listAllValues(obj) { 
    // your code here 
    var array = []; 
    for(var key in obj) { 
    if(obj.hasOwnProperty(key)) { 
     var value = obj[key]; 
     array.push(value); 
    } 
} 
    console.log(array); 

} 

listAllValues(obj); 

我要專注於這個代碼:

for(key in obj) { 
    if(obj.hasOwnProperty(key)) { 

    } 
} 

爲什麼我們總是需要檢查,如果obj有自己的屬性鍵? 這聽起來不太清楚。任何人都可以用俗語說明給我看? 這裏對不起。

回答

9

hasOwnProperty檢查是對象本身的property。它也可能是它的一個屬性原型。因此,你檢查屬性是否屬於當前對象,而不是原型。

我有一個object,其具有prototype。純粹的for in它打印所有屬性,也是那些在prototype(id)中的屬性。但是第二個,它只打印屬於該對象本身的那些。

var parent = { 
 
    id: 1 
 
}; 
 

 
var obj = { 
 
    name: 'Test', 
 
    age: 18 
 
}; 
 

 
Object.setPrototypeOf(obj, parent); 
 

 
// All properties, also the prototype's. See the `id` property 
 
console.log('All properties'); 
 
for(var key in obj){ 
 
    console.log(key); 
 
} 
 

 
console.log('Only it\'s properties'); 
 
// All properties that belong only to object 
 
for(var key in obj){ 
 
    if(obj.hasOwnProperty(key)) { 
 
     console.log(key); 
 
    } 
 
}

3

這是一個從黑暗的時代的殘餘,當JS是不是光滑,它的開發者更加粗糙。當大家extended basic prototypes和我們沒有define non-enumerable properties的能力。

所以你永遠不會知道什麼屬性結束在你的對象,由於繼承;那是當我們介紹這種檢查它是否屬於自己的財產的做法。這也是開始被認爲是擴展外國原型的不好做法。

但是,這些更粗糙,更黑暗的時代。當你需要精神力量寫JS的時候。當你需要智慧來編寫一個可以在多個瀏覽器中工作的功能,並且鋼鐵般的神經接近甚至修改別人的代碼時,永遠不會知道你可能會帶給你什麼。

現在我立即放棄一個外部庫如此無情地隨機修改基本原型(極少數例外),特別是如果它不能生成這些擴展enumerable:false

相關問題