为什么要在 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
将遍历所有属性。
我知道继承的属性是不可枚举的。在下面的代码中 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
将遍历所有属性。