当前位置 : 主页 > 手机开发 > 其它 >

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

来源:互联网 收集:自由互联 发布时间:2021-06-19
我知道继承的属性不是可枚举的.在以下代码中,stanford从另一个对象大学继承属性级别. 但是当我列举斯坦福时,我发现继承的属性也被列出了.请解释一下(我必须在某处犯错). var universi
我知道继承的属性不是可枚举的.在以下代码中,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"]

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

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
网友评论