admin管理员组文章数量:1315252
In developer console (Mozilla, Chrome, nvm) this code work as expected:
var proto = {x: 3};
var obj = Object.create(proto);
So obj
will be {x: 3}
But in node.js i get {}
Why?
In developer console (Mozilla, Chrome, nvm) this code work as expected:
var proto = {x: 3};
var obj = Object.create(proto);
So obj
will be {x: 3}
But in node.js i get {}
Why?
-
I guess it's because the node console doesn't show inherited properties? How are you logging
obj
?obj.x
is almost definitiely3
. – John Dvorak Commented Oct 2, 2014 at 10:51 - 2 Closely related: Why does console.log() not show inherited properties from Object.create? (though the answers there aren't very practically helpful) (@JanDvorak) – apsillers Commented Oct 2, 2014 at 10:56
2 Answers
Reset to default 7It's working all right. However, the object {x:3}
is the prototype obj
. When Node prints out the object, it only prints its own properties. x
is a prototype property. Try it!
var proto = {x: 3};
var obj = Object.create(proto);
alert(obj.x) // 3
(Yes, i know this is a browser, but it's the same JavaScript. :))
Read more: Object.create()
In Node.js, when you use console.log
to print something, it uses util.inspect
to get the string representation of the object. Quoting from console.log
doc,
If formatting elements are not found in the first string then
util.inspect
is used on each argument.
When we check the util.inspect
we understand that, unless it is called with showHidden
property set to true
, it will not include the object's non-enumerable properties.
But wait, non-enumerable properties are entirely different from properties inherited via prototype chain. So, even util.inspect
cannot see them. Then how do we get to see the inherited properties?
The only way to get the objects inherited via prototype chain is by using a for..in
loop. Quoting from for..in
's MDN doc,
The loop will iterate over all enumerable properties of the object itself and those the object inherits from its constructor's prototype (properties closer to the object in the prototype chain override prototypes' properties).
You can confirm that like this
var proto = {
x: 3
};
var obj = Object.create(proto);
for (var key in obj) {
console.log(key);
}
// x
Since console.log
is not part of the ECMA Standard specification, various implementations can implement it as they like. So, the browsers would be internally using the for..in
loop to gather all the inherited properties whereas node guys decided not to do so.
本文标签: javascriptWhy Objectcreate does not work in nodejsStack Overflow
版权声明:本文标题:javascript - Why Object.create does not work in node.js - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741962382a2407356.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论