[[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,
- Let tag be
Get (O, @@toStringTag)
.
ReturnIfAbrupt(tag)
.
- If
Type(tag)
is not String
, let tag
be builtinTag
.
- 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 标志)。
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,
- Let tag be
Get (O, @@toStringTag)
.ReturnIfAbrupt(tag)
.- If
Type(tag)
is notString
, lettag
bebuiltinTag
.- 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 标志)。