2017-06-17 46 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

相关问题