.= 'tag.htm'; break; case 'flag': $pre .= $default_pre .= 'flag.htm'; break; case 'my': $pre .= $default_pre .= 'my.htm'; break; case 'my_password': $pre .= $default_pre .= 'my_password.htm'; break; case 'my_bind': $pre .= $default_pre .= 'my_bind.htm'; break; case 'my_avatar': $pre .= $default_pre .= 'my_avatar.htm'; break; case 'home_article': $pre .= $default_pre .= 'home_article.htm'; break; case 'home_comment': $pre .= $default_pre .= 'home_comment.htm'; break; case 'user': $pre .= $default_pre .= 'user.htm'; break; case 'user_login': $pre .= $default_pre .= 'user_login.htm'; break; case 'user_create': $pre .= $default_pre .= 'user_create.htm'; break; case 'user_resetpw': $pre .= $default_pre .= 'user_resetpw.htm'; break; case 'user_resetpw_complete': $pre .= $default_pre .= 'user_resetpw_complete.htm'; break; case 'user_comment': $pre .= $default_pre .= 'user_comment.htm'; break; case 'single_page': $pre .= $default_pre .= 'single_page.htm'; break; case 'search': $pre .= $default_pre .= 'search.htm'; break; case 'operate_sticky': $pre .= $default_pre .= 'operate_sticky.htm'; break; case 'operate_close': $pre .= $default_pre .= 'operate_close.htm'; break; case 'operate_delete': $pre .= $default_pre .= 'operate_delete.htm'; break; case 'operate_move': $pre .= $default_pre .= 'operate_move.htm'; break; case '404': $pre .= $default_pre .= '404.htm'; break; case 'read_404': $pre .= $default_pre .= 'read_404.htm'; break; case 'list_404': $pre .= $default_pre .= 'list_404.htm'; break; default: $pre .= $default_pre .= theme_mode_pre(); break; } if ($config['theme']) { $conffile = APP_PATH . 'view/template/' . $config['theme'] . '/conf.json'; $json = is_file($conffile) ? xn_json_decode(file_get_contents($conffile)) : array(); } !empty($json['installed']) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . ($id ? $id . '_' : '') . $pre; (empty($path_file) || !is_file($path_file)) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . $pre; if (!empty($config['theme_child']) && is_array($config['theme_child'])) { foreach ($config['theme_child'] as $theme) { if (empty($theme) || is_array($theme)) continue; $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . ($id ? $id . '_' : '') . $pre; !is_file($path_file) and $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . $pre; } } !is_file($path_file) and $path_file = APP_PATH . ($dir ? 'plugin/' . $dir . '/view/htm/' : 'view/htm/') . $default_pre; return $path_file; } function theme_mode_pre($type = 0) { global $config; $mode = $config['setting']['website_mode']; $pre = ''; if (1 == $mode) { $pre .= 2 == $type ? 'portal_category.htm' : 'portal.htm'; } elseif (2 == $mode) { $pre .= 2 == $type ? 'flat_category.htm' : 'flat.htm'; } else { $pre .= 2 == $type ? 'index_category.htm' : 'index.htm'; } return $pre; } ?>javascript - Why Object.create does not work in node.js - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Why Object.create does not work in node.js - Stack Overflow

programmeradmin0浏览0评论

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.

发布评论

评论列表(0)

  1. 暂无评论