为什么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属性,而节点家伙决定不这样做。