【问题标题】:why inherited (have confusion if it is inherited at all) properties are being enumerated in javascript?为什么在javascript中枚举继承的(如果它完全被继承的话会有混淆)属性?
【发布时间】:2015-12-26 10:34:07
【问题描述】:

我知道继承的属性是不可枚举的。在下面的代码中,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);
}

【问题讨论】:

标签: javascript inheritance enumeration


【解决方案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

【讨论】:

    【解决方案2】:

    哪些属性不可枚举?

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

    【讨论】:

      【解决方案3】:

      这是您的stanford-object 的结构:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        • 2010-10-19
        相关资源
        最近更新 更多