[[Class]] 属性 在 JavaScript 个对象中

[[Class]] property in JavaScript objects

object的[[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 渲染到控制台。 Chrome 在 Mac 上没有。

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

ES6中没有[[Class]],有intrinsic objects.

Can I modify the [[Class]] property of the resulting object

好吧,这里有个窍门。内部 属性 [[Class]] 已在 ES-6 中删除。但是,从 [[Class]] 获取值的唯一方法是 Object.prototype.toString.call 方法。现在,您可以将其自定义为 return 任何您想要的名称。引用 draft version of ECMA Script 6,

  1. Let tag be Get (O, @@toStringTag).
  2. ReturnIfAbrupt(tag).
  3. If Type(tag) is not String, let tag be builtinTag.
  4. Return the String that is the result of concatenating "[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 标志)。