我知道继承的属性不是可枚举的.在以下代码中,stanford从另一个对象大学继承属性级别. 但是当我列举斯坦福时,我发现继承的属性也被列出了.请解释一下(我必须在某处犯错). var universi
但是当我列举斯坦福时,我发现继承的属性也被列出了.请解释一下(我必须在某处犯错).
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