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

wba*_*ars 6 javascript node.js

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

var proto = {x: 3};
var obj = Object.create(proto);
Run Code Online (Sandbox Code Playgroud)

所以obj{x: 3}

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

the*_*eye 7

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

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

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

但是等等,不可枚举的属性与通过原型链继承的属性完全不同.所以,甚至util.inspect看不到他们.那么我们如何看待继承的属性呢?

获取通过原型链继承的对象的唯一方法是使用for..in循环.引自for..inMDN文档,

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

你可以这样确认

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

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


Sci*_*ter 6

它工作得很好.但是,对象{x:3}原型 obj.当Node打印出对象时,它只打印自己的属性.x是一个原型属性.试试吧!

var proto = {x: 3};
var obj = Object.create(proto);
alert(obj.x) // 3
Run Code Online (Sandbox Code Playgroud)

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

阅读更多: Object.create()