【问题标题】:Why Object.create does not work in node.js为什么 Object.create 在 node.js 中不起作用
【发布时间】:2014-10-02 10:48:44
【问题描述】:

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

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

所以obj 将是{x: 3}

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

【问题讨论】:

标签: javascript node.js


【解决方案1】:

在 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 循环来收集所有继承的属性,而节点人员决定不这样做。

【讨论】:

    【解决方案2】:

    一切正常。然而,对象{x:3}原型 obj。当 Node 打印出对象时,它只打印自己的属性。 x 是原型属性。试试看!

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

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

    阅读更多:Object.create()

    【讨论】:

    • “当 Node 打印出对象时,它只打印它自己的属性”——你有这方面的参考吗?
    • @JanDvorak 我试图用一些文档参考来解释它。请检查一下。
    猜你喜欢
    • 2014-08-20
    • 2017-11-06
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2011-07-09
    • 1970-01-01
    • 2014-03-11
    相关资源
    最近更新 更多