JavaScript对象中的[[Class]]属性

JavaScript对象中的[[Class]]属性,javascript,ecmascript-6,ecmascript-harmony,Javascript,Ecmascript 6,Ecmascript Harmony,对象的[[Class]]属性是根据创建对象的方式设置的 这就是为什么一些对象以一种有意义的方式呈现到Chrome控制台,例如MyFoo,而其他对象则简单地呈现为Object 使用ES6中的新对象文字语法来配置原型链。我是否可以修改结果对象的[[Class]]属性,以便以更有意义的方式呈现给控制台 var x = { __proto__: MyCtor.prototype }; console.log(x); // I want something like MyCtor to be logged

对象的
[[Class]]
属性是根据创建对象的方式设置的

这就是为什么一些对象以一种有意义的方式呈现到Chrome控制台,例如
MyFoo
,而其他对象则简单地呈现为
Object

使用ES6中的新对象文字语法来配置原型链。我是否可以修改结果对象的
[[Class]]
属性,以便以更有意义的方式呈现给控制台

var x = { __proto__: MyCtor.prototype };
console.log(x); // I want something like MyCtor to be logged to the console
我注意到,在Mac上的Safari 8中,上面将
MyCtor
呈现到控制台。Mac电脑上的Chrome没有


PS:这可能是因为我对支持这个原型链初始化语法的浏览器感到困惑。

在ES6中没有[[Class]],有。

在ES6中没有[[Class]],有

我可以修改结果对象的
[[Class]]
属性吗

嗯,这里有个窍门。ES-6中已删除内部属性
[[Class]]
。但是,从
[[Class]]
获取值的唯一方法是
Object.prototype.toString.call
方法。现在,您可以自定义它以返回您想要的任何名称。引用

  • 设标记为
    Get(O,@@toStringTag)
  • ReturnIfAbrupt(标签)
  • 如果
    类型(标记)
    不是
    字符串
    ,则让
    标记
    成为
    内置标记
  • 返回串接
    “[object”、标记和“]”的结果字符串。
  • 因此,如果我们可以更改
    @@toStringTag
    ,我们实际上可以更改
    对象.prototype.toString.call
    的结果。我们这样改变它

    var obj = {};
    
    Object.defineProperty(obj, Symbol.toStringTag, {
        get: function() {
            return "MyClass";
        }
    });
    
    console.log(Object.prototype.toString.call(obj));
    # [object MyClass]
    
    注意:上述程序在iojs中测试(v1.0.2,启用了--harmony标志)

    我可以修改结果对象的
    [[Class]]
    属性吗

    嗯,这里有个窍门。ES-6中已删除内部属性
    [[Class]]
    。但是,从
    [[Class]]
    获取值的唯一方法是
    Object.prototype.toString.call
    方法。现在,您可以自定义它以返回您想要的任何名称。引用

  • 设标记为
    Get(O,@@toStringTag)
  • ReturnIfAbrupt(标签)
  • 如果
    类型(标记)
    不是
    字符串
    ,则让
    标记
    成为
    内置标记
  • 返回串接
    “[object”、标记和“]”的结果字符串。
  • 因此,如果我们可以更改
    @@toStringTag
    ,我们实际上可以更改
    对象.prototype.toString.call
    的结果。我们这样改变它

    var obj = {};
    
    Object.defineProperty(obj, Symbol.toStringTag, {
        get: function() {
            return "MyClass";
        }
    });
    
    console.log(Object.prototype.toString.call(obj));
    # [object MyClass]
    

    注意:上面看到的程序在iojs中测试(v1.0.2,启用了和谐标志)。

    ES6 afaik中没有
    [[Class]]
    。@elclanrs好的,谢谢你回答这个问题,我会接受。不,恐怕
    [[Class]
    从未影响
    控制台。log
    显示对象。没有
    [[Class]]
    在ES6 afaik中。@elclars好的,谢谢你回答这个问题,我会接受。不,afaik
    [[Class]]
    从未影响
    控制台.log
    显示对象的方式。通过计算属性,这甚至可以简化为
    var obj={[Symbol.toStringTag]:“MyClass”}var obj={[Symbol.toStringTag]:“MyClass”}