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

Javascript 为什么Object.create在node.js中不起作用,javascript,node.js,Javascript,Node.js,在开发人员控制台(Mozilla、Chrome、nvm)中,此代码按预期工作: var proto = {x: 3}; var obj = Object.create(proto); 因此,obj将是{x:3} 但是在node.js中,我得到了{} 为什么?它工作正常。但是,对象{x:3}是原型obj。当节点打印出对象时,它只打印自己的属性x是一个原型属性。试试看 var proto={x:3}; var obj=Object.create(proto); alert(obj.x)//3在N

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

var proto = {x: 3};
var obj = Object.create(proto);
因此,
obj
将是
{x:3}

但是在node.js中,我得到了
{}


为什么?

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

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

alert(obj.x)//3
在Node.js中,当您使用
console.log
打印内容时,它使用
util.inspect
获取对象的字符串表示形式。引用

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

当我们检查时,我们了解到,除非调用时
showHidden
属性设置为
true
,否则它将不包括对象的不可枚举属性

但等等,不可枚举属性和通过原型链继承的属性完全不同。因此,即使是
util.inspect
也无法看到它们。那么我们如何才能看到继承的属性呢

通过原型链继承对象的唯一方法是使用
for..in
循环。引用

循环将迭代对象本身的所有可枚举属性以及对象从其构造函数原型继承的属性(原型链中更接近对象的属性覆盖原型的属性)

你可以这样确认

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

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

我猜这是因为节点控制台不显示继承的属性?您是如何记录obj的
obj.x
几乎是明确的
3
。密切相关:(虽然那里的答案没有太大实际帮助)(@JanDvorak)“当Node打印出对象时,它只打印自己的属性”-你对此有参考吗?@JanDvorak我试图用一些文档参考来解释它。请检查一下。