Chrome 和 Firefox 如何在控制台中打印对象的类名?

hug*_*omg 5 javascript eval prototypal-inheritance

如果我使用“传统”Javascript 类创建 Foo 类,则在控制台上打印 Foo 实例时,chrome 和 Firefox 都会显示 Foo 名称:

function Foo(){
    this.x = 10;
}

console.log(new Foo());
// Foo {x: 10}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我使用手工滚动原型继承,那么在调试时我不会得到有用的名称

function mkClass(init, proto){
    return function(/**/){
         var obj = Object.create(proto);
         init.apply(obj, arguments);
         return obj;
    }
}

var Bar = mkClass(function(){ this.x = 10 }, {});

console.log(Bar());
// Object {x: 10}
Run Code Online (Sandbox Code Playgroud)

有没有办法让通过我的原型系统创建的类在控制台上打印时显示它们的名称?到目前为止,我能想到的唯一方法是一个丑陋的黑客滥用 eval 为 mkClass 返回的当前匿名构造函数提供不同的名称。

Ant*_*n L 2

看来 FF 和 chrome 只是打印constructor property。尝试将其设置为有意义的内容,您应该会看到结果。

function mkClass(init, proto){
    proto.constructor = {name: "Foo"};
    return function(/**/){
         var obj = Object.create(proto);
         init.apply(obj, arguments);
         return obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 正如 @Mathletics 提到的,即使对于第一个示例,FF也会返回 [object Object] 。所以看起来FF只“知道”标准类型,所有其他类型都显示为“对象”。 (2认同)
  • 警告!此方法导致“constructor”属性列在对象自己的属性中(即“obj.hasOwnProperty('constructor') === true”,而使用标准方法创建的对象则为“false”) (2认同)