javascript - 在 Object.create : properties are there, 之后但 Object.keys/getOwnPropertyNames = []?

标签 javascript object

正如标题所说,我在理解 Object.create() 的工作原理时遇到了概念上的障碍。

我的印象是,使用此方法后,生成的对象将继承作为参数传递给 Object.create() 的对象的值。在下面的简单示例中,我可以创建一个对象并访问其继承的值,我什至可以正确获取新对象的原型(prototype),但是 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.getOwnPropertyNames() 替换 Object.keys() 时,我得到了相同的结果。

我是不是误会了什么?为什么键数组为空?

编辑:我是否正确地假设 Object.keys() 和 Object.getOwnPropertyNames() 只提供对象上直接可用的属性,即不继承? 然后,我想我的问题是:是否有一个函数可以给我一个对象的属性? (继承或其他)

EDIT2:不——必须手动遍历原型(prototype)链,如下所示: 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

最佳答案

Object.create 有两个参数。第一个是创建对象的原型(prototype),第二个可选参数是属性描述符的对象。

Object.create(proto[, propertiesObject])

如果创建对象时将属性对象作为第一个参数传递,

let obj = Object.create({x: 1, y: 2});

这个将成为您的新对象的原型(prototype)。 由于 Object.keys() 返回仅包含其自己的可枚举属性的数组,因此不会列出您在构造它时传递的属性。

要按照您想要的方式创建对象,您可以使用 Object.assign:

let obj = Object.assign({}, {x: 1, y: 2});

关于javascript - 在 Object.create : properties are there, 之后但 Object.keys/getOwnPropertyNames = []?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42783643/

相关文章:

java - 请解释使用显式转换为对象的输出

javascript - 编写全局函数以在 Angular 所有组件中使用

javascript - 查找图像宽度、高度以及起点和终点

javascript - 从 jquery 到页面变量

javascript - 淡入淡出的元素正在改变和调整

c++ - 释放 STL vector 中的对象

javascript - d3.js transition().remove() 不工作

javascript - 通用树的递归循环

javascript - 在单个常量中使用 Object.keys()、map()、...Array()、reduce() 和 concat()

Java对象数组