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?

Share Improve this question edited Oct 2, 2014 at 11:17 Bud Damyanov 31.9k6 gold badges47 silver badges53 bronze badges asked Oct 2, 2014 at 10:48 wbarswbars 5336 silver badges14 bronze badges 2
  • I guess it's because the node console doesn't show inherited properties? How are you logging obj? obj.x is almost definitiely 3. – 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
Add a ment  | 

2 Answers 2

Reset to default 7

It'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