为什么object.keys()到Object literal和Object.create()有不同的结果?

时间:2018-02-05 16:35:20

标签: javascript

mdn Object.keys()定义它将返回给定对象自己的可枚举属性的数组。

var USComicPublishers = {
countryOfOrigin : {
    value  : "USA",
    enumerable: false,
    writable: false,
    configurable: false
},
medium : {
    value  : "comic books",
    enumerable: true,
    writable: false,
    configurable: false
}
}

作为Object.keys()定义,它应该返回['medium']

但它会返回['countryOfOrigin', 'medium']

然后我使用Object.create()来包装它,它将返回['medium']

var us2 = Object.create({}, USComicPublishers)
console.log(us2)
// return ['medium']

Object literal中的Object.create()行为有不同吗?



var USComicPublishers = {
    countryOfOrigin : {
        value  : "USA",
        enumerable: false,
        writable: false,
        configurable: false
    },
    medium : {
        value  : "comic books",
        enumerable: true,
        writable: false,
        configurable: false
    }
}
console.log(Object.keys(USComicPublishers))
var us2 = Object.create({}, USComicPublishers)
console.log(Object.keys(us2))
console.log(Object.getOwnPropertyNames(us2))




2 个答案:

答案 0 :(得分:3)

给定一个对象字面值 - { foo: bar } - bar属性。这是简单而简单的价值。它没有正确确定关于的任何内容(例如它是否可枚举)。

传递给Object.create时,该值将作为属性描述。这确定了属性是否可枚举等。

答案 1 :(得分:3)

是的,有区别。创建对象文字时,无法像这样设置enumerablewritableconfigurable属性。相反,您设置的属性设置为true并将value设置为您给出的值(您在第一个示例中会注意到USComicPublishers.medium将是一个对象和USComicPublishers.medium.value === "comic books"

如果您想要相同的结果,则必须创建对象文字,然后使用Object.defineProperties应用属性。

var USComicPublishersData = {
    countryOfOrigin : {
        value  : "USA",
        enumerable: false,
        writable: false,
        configurable: false
    },
    medium : {
        value  : "comic books",
        enumerable: true,
        writable: false,
        configurable: false
    }
}
var USComicPublishers = {};
Object.defineProperties(USComicPublishers, USComicPublishersData);
console.log(Object.keys(USComicPublishers))