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

时间:2014-10-02 10:48:45

标签: javascript node.js

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

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

所以obj将为{x: 3}

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

2 个答案:

答案 0 :(得分:7)

在Node.js中,当您使用console.log打印某些内容时,它使用util.inspect来获取对象的字符串表示形式。引自console.log doc

  

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

当我们检查util.inspect时,我们了解到,除非在showHidden属性设置为true的情况下调用它,否则它将不包含对象的非可枚举属性

但是等等,不可枚举的属性与通过原型链继承的属性完全不同。所以,即使util.inspect也看不到它们。那么我们如何才能看到继承的属性?

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

  

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

您可以像这样确认

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

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

答案 1 :(得分:6)

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



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




(是的,我知道这是一个浏览器,但它是相同的JavaScript。:))

了解详情:Object.create()