【问题标题】:How to console.log all inherited properties?如何控制台记录所有继承的属性?
【发布时间】:2015-09-15 00:21:03
【问题描述】:

对不起菜鸟问题。我只是在学习 JavaScript。

我有一个简单的对象。

var bike = {
  wheels: 2,
};

我创建了一个新的,它通过 create() 继承了所有自行车值,并向新对象添加了一些新属性。

var raleigh = Object.create(bike);
raleigh.color = 'red';

当我对新的罗利对象执行 console.log 时,我看不到从自行车对象继承的属性。

console.log(raleigh);

日志是:

{ color: 'red' }

如何记录到控制台所有属性,包括这些继承的?

【问题讨论】:

标签: javascript object inheritance


【解决方案1】:

当一个对象通过console.log 打印时,它会打印出它自己的所有属性和一个指向它所继承的对象的链接。你可以在控制台看到所有继承的属性,你只需要按照显示对象的原型链(通常使用__proto__[[prototype]]键)。

【讨论】:

  • 您应该在控制台中看到 __proto__ 作为对象的属性之一 - 单击它以展开它。
  • @MattBrowne 我认为它取决于浏览器
  • @Bergi 感谢您提供更多信息
【解决方案2】:

当您使用Object.create 时,您的原型将与您继承的对象相同,因此,要显示“父”属性,您可以看到原型:

console.log(raleigh);
console.log(Object.getPrototypeOf(raleigh));

也许你会期待更多,但我认为这是展示这些属性的快速方式。

【讨论】:

  • 这正是我想要的。谢谢你。后来我发现这个,它做同样的工作。 console.log(raleigh.__proto__);
  • 不客气@PawełGrzybek ;) 以前我写过 raleigh.__proto__ 但版主更新了我的答案,可能是因为不兼容所有浏览器。
  • 也许他是对的developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 谢谢大家!我是 Stack Overflow 的新用户,但我已经爱上了它!
【解决方案3】:

这会有帮助吗? 我正在发出警报,你也可以检查控制台!

 var bike = {
      wheels: 2,
    };
    var raleigh = Object.create(bike);
    raleigh.color = 'red';
    function getAllProperties( obj ) {
        var properties = [];
    
        do {
            properties= properties.concat(Object.getOwnPropertyNames( obj ));
        } while ( obj = Object.getPrototypeOf( obj ) );
    
        return properties;
    }
    alert(getAllProperties(raleigh));
    console.log(getAllProperties(raleigh));

【讨论】:

    【解决方案4】:

    您可以创建一个新的对象,特别是为您的日志创建一个自己的属性

    function flatten_inheritance(e) {
        var o = Object.create(null), i, prop;
        do {
            prop = Object.getOwnPropertyNames(e);
            for (i = 0; i < prop.length; ++i)
                if (!(prop[i] in o))
                    o[prop[i]] = e[prop[i]];
        } while (e = Object.getPrototypeOf(e));
        return o;
    }
    
    flatten_inheritance(raleigh); // Object {color: "red", wheels: 2, valueOf, toString, etc..}
    

    如果您想停在Object.prototype 或其他原型,您可以在while 条件下执行此操作;

    while (e = Object.getPrototypeOf(e) && e !== Object.prototype);
    

    我建议您仅在调试时执行此操作,而不是将所有代码从继承中移开

    【讨论】:

    • Object.prototype 方法发生了什么,不应该也显示吗?
    • @Bergi 这个方法确实包含它们,让我让它更明显
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2014-09-17
    • 2020-01-19
    • 2022-01-22
    • 2014-06-14
    相关资源
    最近更新 更多