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

[[Class]] property in JavaScript objects

本文关键字:Class 属性 对象 JavaScript      更新时间:2023-09-26

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

这就是为什么一些对象以有意义的方式呈现到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:也许这是因为我对支持这种原型链初始化语法的浏览器感到困惑。

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

好吧,这里有个诀窍。ES-6中已删除内部属性[[Class]]。但是,从[[Class]]中获得值的唯一方法是Object.prototype.toString.call方法。现在,您可以自定义它来返回您想要的任何名称。引用ECMA脚本6的草案版本,

  1. 设标签为Get (O, @@toStringTag)
  2. CCD_ 11
  3. 如果Type(tag)不是String,则设tagbuiltinTag
  4. 返回字符串,该字符串是连接"[object ", tag, and "]"的结果

所以,如果我们能改变@@toStringTag,我们实际上可以改变Object.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标志)。

ES6中没有[[class]],存在内部对象。