gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:38:48 25 4
gpt4 key购买 nike

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

这就是为什么某些对象以有意义的方式呈现给 Chrome 控制台的原因,例如MyFoo 和其他的只是简单地呈现为 Object?

使用 ES6 中新的对象字面量语法来配置原型(prototype)链。我可以修改结果对象的 [[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:这可能是我对支持这种原型(prototype)链初始化语法的浏览器感到困惑。

最佳答案

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

好吧,这里有一个技巧。内部属性 [[Class]] 已在 ES-6 中删除。但是,从 [[Class]] 获取值的唯一方法是 Object.prototype.toString.call 方法。现在,您可以自定义它以返回您想要的任何名称。引用 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 中测试的(启用了 --harmony 标志的 v1.0.2)。

关于javascript - JavaScript 对象中的 [[Class]] 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28829775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com