为什么继承(如果它被继承则有混淆)属性是在javascript中枚举的?

时间:2015-12-26 10:34:07

标签: javascript inheritance enumeration

我知道继承的属性不可枚举。在以下代码中,stanford从另一个对象level继承属性university

但是当我枚举stanford时,我发现继承的属性也被列出了。请解释一下(我在某处肯定是错的)。

var university = {level:"bachelor"};

var stanford = Object.create(university);
stanford.country = "USA";
stanford.rating = "Good";

console.log(Object.hasOwnProperty("level"));    //  false

for(var properties in stanford){                //  level, country, rating
    console.log(properties);
}

3 个答案:

答案 0 :(得分:1)

如此精彩link!!感谢@Sajib Biswas提出这个问题。

参考object-getownpropertynames-vs-object-keys

how-do-i-enumerate-the-properties-of-a-javascript-object

我认为这可能有所帮助:

var proto = Object.defineProperties({}, {
  protoEnumTrue: { value: 1, enumerable: true },
  protoEnumFalse: { value: 2, enumerable: false }
});
var obj = Object.create(proto, {
  objEnumTrue: { value: 1, enumerable: true },
  objEnumFalse: { value: 2, enumerable: false }
});

for (var x in obj) console.log(x);

Results: 

objEnumTrue
protoEnumTrue


console.log(Object.keys(obj)); // ["objEnumTrue"]
console.log(Object.getOwnPropertyNames(obj)); //  ["objEnumTrue", "objEnumFalse"]

枚举不仅会返回被枚举对象的属性,还会返回任何父对象的原型。

Object.getOwnPropertyNames(a)返回对象a的所有属性。 Object.keys(a)返回所有可枚举的自有属性。

来自您的示例:

var university = {level:"bachelor"};

var stanford = Object.create(university);
stanford.country = "USA";
stanford.rating = "Good";

console.log(university.hasOwnProperty("level"));    //  true
console.log(university.hasOwnProperty("country"));    //  false

console.log(stanford.hasOwnProperty("country"));    //  true
console.log(stanford.hasOwnProperty("level"));    //  false

答案 1 :(得分:1)

  

哪些属性不可枚举?

Javascript有两种类型的对象属性:Data属性和Accessor属性。在您的情况下,您正在使用data属性。 使用enumeration方法操纵某个属性的Object.defineProperty()属性描述符 例如:

 var stanford = Object.create(university);
    stanford.country = "USA";
    stanford.rating = "Good";
    Object.defineProperty(stanford, 'rating', {
        enumerable: false
    });

 console.log(Object.keys(stanford)); // Now you won't see 'rating' here
 // the same effect takes place for loop operators (for;;) , for .. in ..)

答案 2 :(得分:1)

这是stanford - 对象的结构:

enter image description here

正如您所看到的,它继承了具有属性level的其他Object,但不是“hasOwnProperty”level。但是for..in将遍历所有属性。