【问题标题】:Why does console.log() not show inherited properties from Object.create?为什么 console.log() 不显示从 Object.create 继承的属性?
【发布时间】:2012-10-29 08:20:09
【问题描述】:

我在尝试在基础对象上利用 Object.defineProperty() 时遇到了挂断。我想从该对象继承属性,使用Object.create(),然后在派生对象中定义更多属性(可以从那里继承)。我应该注意,我的目标是 node.js。

这是一个例子:

var Base = {};

Object.defineProperty(Base, 'prop1', {
    enumerable:true,
    get:function(){ return 'prop1 value';}
});

Object.defineProperty(Base, 'prop2', {
    enumerable:true,
    value : 'prop 2 value'
});

Object.defineProperty(Base, 'create', {
    value:function(){
        return Object.create(Base);
    }
});

console.log(Base);

var derived = Base.create();

Object.defineProperty(derived, 'prop3', {
    enumerable:true,
    value:'prop 3 value'
});

console.log(derived);

输出如下:

{ prop1: [Getter], prop2: 'prop 2 value' }
{ prop3: 'prop 3 value' }

我认为 console.log() 会枚举继承的属性,以及我在派生对象上定义的属性prop3。它似乎不会查找以这种方式定义的属性的原型层次结构。对吗?

我查看了为我的对象覆盖 toString() 方法,但似乎 console.log() 没有调用它。

  1. 如何在无需枚举的情况下记录所有属性?
  2. 这是实现继承的有效方式吗?

编辑:

  1. node.js 的库中是否有另一个函数可以完成这项工作并记录继承的属性?

【问题讨论】:

  • 对于初学者来说,console 的实现是特定于浏览器的。您真的不能依赖它以相同的方式运行,浏览器到浏览器,因为每个供应商都在做一些与非标准完全不同的事情。当你在 Chrome 开发工具中 console.log(object); 时,你会得到一个可扩展的节点树,它具有所有拥有的方法和属性,并且还有 proto 链,它具有完整的继承堆栈......期待这个每个浏览器都不会发生 - 某些浏览器 (WP7 IE9) 中的程序即使看到 window.console 也会崩溃,因为它们甚至没有实现。
  • “我应该注意,我的目标是 node.js。”

标签: javascript node.js inheritance


【解决方案1】:

Firebug 记录继承的属性:

虽然 Chrome 为您提供了一个包含继承属性的树视图:

【讨论】:

  • @dwerner Chrome 提供了一个树形视图。 console.log 是特定于实现的。似乎 Node.js 决定只记录自己的属性。当然,这并不意味着该对象不继承其他两个属性。
【解决方案2】:

您可以在可用的情况下使用console.dir()

console.dir(derived) 

它会在 __proto__ 对象上显示您的对象的继承属性

编辑:虽然似乎没有出现在节点上

【讨论】:

  • 了解console.dir() 也很好,谢谢。我只是不确定我想依赖__proto__
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多