为什么要在 javascript 中枚举继承的(如果它是继承的,就会混淆)属性?

why inherited (have confusion if it is inherited at all) properties are being enumerated in javascript?

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

继承了一个 属性 level

但是当我枚举 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);
}

太棒了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"]

枚举将 return 属性不仅来自被枚举的对象,还来自任何父对象的原型。

Object.getOwnPropertyNames(a) returns对象a的所有属性。 Object.keys(a) return所有可枚举的自身属性。

来自你的例子:

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

which properties are not enumerable?

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 ..)

这是您的 stanford-对象的结构:

如您所见,它继承了另一个具有 属性 level 但没有 "hasOwnProperty" level 的对象。但是 for..in 将遍历所有属性。