问题描述
有此代码
var a = {date : 12};
for(var t in a){
alert(t);
}
我有一个日期属性警报。
但是在任何地方(即 ),我都需要编写:
for (var property in object) {
if (object.hasOwnProperty(property)) {
// do stuff
}
}
那么,为什么我看不到对象的内部属性?
1楼
awj
0
2015-07-31 09:35:47
在JavaScript中,存在“原型链”(一种继承形式)。
如果您要添加属性的原型a ,然后添加您的date ,直接财产上a ,您for循环会发现这两个属性。
hasOwnProperty检查当前属性是否已直接附加到上下文对象,或者是否已通过原型链继承。
所以在我的例子,如果你已经添加了一个属性a的原型,该hasOwnProperty条件将返回false,你会不会‘做的东西’的程度。
2楼
doldt
0
已采纳
2015-07-31 09:36:25
for..in语法会迭代对象的每个属性,包括在原型链上找到的属性(如果它们是可枚举的) 。
通常这不是您想要的,因此通常建议使用hasOwnProperty检查。
在您的情况下,这是没有必要的,因为您的普通对象不会从Object原型(其原型链中唯一的东西)继承任何可枚举的属性
同样,for..in为您提供对象的属性名称 (键),如果您对该特定属性的值感兴趣,则必须使用方括号表示法,将示例扩展至此:
var a = {date : 12};
for(var t in a){
alert(a[t]);
}
3楼
Daniel Conde Marin
0
2015-07-31 09:38:17
我想最好的方式是看一个例子:
Object.prototype.aBaseProperty = 123;
var childObject = { date: 12 };
for (var property in childObject) {
console.log(property)
}
// output: date aBaseProperty
for (var property in childObject) {
if (childObject.hasOwnProperty(property)) {
console.log(property)
}
}
// output: date
4楼
Jacob
0
2015-07-31 09:41:41
另外,您可能希望不执行hasOwnProperty检查
Object.keys(object).forEach(function(value, key) { ... });
其中Object.keys将仅返回自己的属性。