在开发者控制台(Mozilla,Chrome,nvm)中,此代码按预期工作:
var proto = {x: 3};
var obj = Object.create(proto);
所以obj
将为{x: 3}
但是在node.js中我得到{}
为什么呢?
答案 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()