为什么Object.create在node.js中不起作用

在开发人员控制台(Mozilla,Chrome,nvm)中,此代码按预期工作:

var proto = {x: 3}; var obj = Object.create(proto); 

所以obj将是{x: 3}

但是在node.js中我得到了{}
为什么?

它工作正常。 但是,对象{x:3}原型 obj 。 当Node打印出对象时,它只打印自己的属性。 x是一个原型属性。 尝试一下!

 var proto = {x: 3}; var obj = Object.create(proto); alert(obj.x) // 3 

在Node.js中,当您使用console.log打印某些内容时,它使用util.inspect来获取对象的string表示forms。 从console.log文档引用,

如果在第一个string中找不到格式化元素,则在每个参数上使用util.inspect

当我们检查util.inspect我们明白,除非使用showHidden属性将其设置为true ,否则将不包含该对象的非枚举属性

但是,等等,不可枚举的属性完全不同于通过原型链inheritance的属性。 所以,即使util.inspect也看不到它们。 那我们怎么看inheritance的属性呢?

获取通过原型链inheritance的对象的唯一方法是使用for..in循环。 从for..in .. doc中引用,

循环将遍历对象本身的所有可枚举属性,并且这些对象inheritance自其构造函数的原型 (靠近原型链中的对象的属性覆盖原型的属性)。

你可以这样确认

 var proto = { x: 3 }; var obj = Object.create(proto); for (var key in obj) { console.log(key); } // x 

由于console.log不是ECMA标准规范的一部分,因此各种实现可以按照自己的喜好来实现。 因此,浏览器将在内部使用for..in循环来收集所有的inheritance属性,而节点家伙决定不这样做。