访问Js中的内部对象字段

时间:2015-07-31 09:29:00

标签: javascript oop reflection

拥有此代码

var a = {date : 12};
for(var t in a){
    alert(t);
}

我有一个带有日期属性的警报。

但无处不在(即here)我发现需要写:

for (var property in object) {
    if (object.hasOwnProperty(property)) {
        // do stuff
    }
}

那么为什么我没有看到对象的内部属性呢?

4 个答案:

答案 0 :(得分:0)

在JavaScript中存在'原型链',一种继承形式。如果您要将属性添加到a的原型中,然后将date属性直接添加到a,那么您的for循环将找到这两个属性。

hasOwnProperty检查当前属性是否已直接附加到上下文对象,或者是否已通过原型链继承。

因此,在我的示例中,如果您已经a的原型添加了属性,那么hasOwnProperty条件将返回false并且您不会t"做东西"用它。

答案 1 :(得分:0)

for..in语法迭代对象的每个属性,包括在原型链上找到的属性(如果它们是可枚举的)。这通常不是您想要的,因此通常建议hasOwnProperty检查。

在你的情况下,它没有必要,因为你的普通对象不会从Object原型(它的原型链中唯一的东西)继承任何可枚举的属性。

另外,for..in为您提供了对象的属性 names (键),如果您对该特定属性的值感兴趣,则必须使用括号表示法,将您的示例扩展到:

var a = {date : 12};
for(var t in a){
    alert(a[t]);
}

答案 2 :(得分:0)

我想看到它的最好方法是通过一个例子:

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

答案 3 :(得分:0)

此外,您可能不愿意进行hasOwnProperty检查,而是

Object.keys(object).forEach(function(value, key) { ... });

Object.keys只返回自己的属性。