我有以下代码。
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
是否有自己的属性键?
这对我来说听起来不太清楚。任何能够以非专业术语向我解释的人?
对不起来这里。
答案 0 :(得分: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);
}
}

答案 1 :(得分:3)
这是一个来自黑暗时代的残余,当JS不是那么光滑而且它的开发者更粗糙。当每个人extended basic prototypes而我们没有define non-enumerable properties的能力时。
所以你永远不知道由于继承而导致你的对象出现了什么属性;当我们介绍这种检查的做法时,它就是一个属于自己的财产。这也是扩展外国原型的一种不良做法。
但这些是更粗糙,更黑暗的时期。当你需要精神力量来编写JS的时候。当你需要智慧来编写一个在多个浏览器中工作的功能时,钢铁的神经接近甚至修改别人的代码,从来不知道你可能带给你的是什么?
现在我立即放弃了一个外来的lib,它会随机修改基本原型(极少数例外),特别是如果它不能进行这些扩展{{1} }。