正如标题所说,我在理解Object.create()如何工作方面遇到了一个概念障碍。
我的印象是,在使用此方法之后,生成的对象将继承作为Object.create()参数传递的对象的值。在下面的简单示例中,我可以创建一个对象并访问其继承的值,我甚至可以正确地获取新对象的原型,但是Object.keys()数组是空的!
let obj = Object.create({x: 1, y: 2});
console.log("Keys of obj:");
Object.keys(obj).forEach(function (key) {
console.log(key + ' - ' + obj[key]);
});
console.log("Prototype of obj:");
console.log(Object.getPrototypeOf(obj));
console.log("obj.x = " + obj.x);
控制台结果:
acg@acg:~/dev/$ node test.js
Keys of obj:
Prototype of obj:
{ x: 1, y: 2 }
obj.x = 1
(只是为了消除任何混淆:顺便说一下,当用Object.keys()代替Object.keysO时,我得到相同的结果。
我误解了什么吗?为什么键数组是空的?
编辑:我是否正确地假设Object.keys()和Object.getOwnPropertyNames()只给我一个对象直接可用的属性,即没有继承? 然后,我认为我的问题是:是否有一个函数可以给我一个对象的属性? (继承或其他)
EDIT2:不 - 手动遍历原型链,如下所示: Is it possible to get the non-enumerable inherited property names of an object?
EDIT3:根据下面Pol Martin的回答,可以使用for..in构造来遍历所有属性(包括那些继承的属性)。 另请参阅https://stackoverflow.com/a/208439/7705625
答案 0 :(得分:1)
Object.create有两个参数。第一个是创建对象的原型,第二个可选参数是属性描述符的对象。
Object.create(proto[, propertiesObject])
如果创建传递属性对象作为第一个参数的对象,
let obj = Object.create({x: 1, y: 2});
这个将成为你新对象的原型。 由于Object.keys()只返回一个只有自己的可枚举属性的数组,因此在构造它时传递的属性不会被列出。
要按照您的意图创建对象,您可以使用Object.assign:
let obj = Object.assign({}, {x: 1, y: 2});