是否可以更改 JavaScript 对象的内部 [[Class]] 属性?

use*_*987 3 javascript

假设我已经创建了一个函数构造函数,例如

    function Bar(){
    }
    var obj = new Bar();
Run Code Online (Sandbox Code Playgroud)

有没有让Object.prototype.toString.call(obj)回报之类的东西[object Date]

Ori*_*iol 5

ECMAScript5没有提供任何修改 [[Class]] 的方法:

该规范没有定义允许程序修改对象的 [[Class]] 或 [[Prototype]] 内部属性或将 [[Extensible]] 的值从 false 更改为 true 的 ECMAScript 语言运算符或内置函数。修改 [[Class]]、[[Prototype]] 或 [[Extensible]] 的实现特定扩展不得违反上一段中定义的不变量。

ECMAScript6 删除了 [[Class]] 内部插槽,但您可以使用 @@toStringTag Well-Known Symbol

  • 规范名称
    @@toStringTag
  • [[描述]]
    "Symbol.toStringTag"
  • 值和用途
    一个字符串值属性,用于创建对象的默认字符串描述。通过内置方法访问Object.prototype.toString
Bar.prototype[Symbol.toStringTag] = 'Date';
Object.prototype.toString.call(new Bar()); // "[object Date]"
Run Code Online (Sandbox Code Playgroud)