有没有改变JavaScript对象的内部[[Class]]属性?

时间:2016-03-09 19:12:33

标签: javascript

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

    function Bar(){
    }
    var obj = new Bar();

是否可以让Object.prototype.toString.call(obj)返回类似[object Date]的内容?

2 个答案:

答案 0 :(得分:4)

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

  

此规范未定义ECMAScript语言运算符或   允许程序修改对象的内置函数   [[Class]]或[[Prototype]]内部属性或更改值   [[可扩展]]从虚假到真实。具体实施   必须修改[[Class]],[[Prototype]]或[[Extensible]]的扩展名   不违反前一段规定的不变量。

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

  
      
  • 规格名称
      @@ toStringTag
  •   
  • [[说明]]
      "Symbol.toStringTag"
  •   
  • 价值和目的
      String值属性,用于创建对象的默认字符串描述。通过内置方法Object.prototype.toString访问。
  •   
Bar.prototype[Symbol.toStringTag] = 'Date';
Object.prototype.toString.call(new Bar()); // "[object Date]"

答案 1 :(得分:0)

如果你想要数据对象 - 创建它,那么你可以只为你自己的目的扩展它,但整体想法'闻起来'。

            Bar.prototype.test = function () {
                return 'test';
            };
            function Bar(){
                var resultObject = new Date();
                Object.setPrototypeOf(resultObject, Object.assign(Object.create(Date.prototype), Bar.prototype));
                return resultObject;
            }
            var obj = new Bar();
            obj.test() === 'test';

            Object.prototype.toString.call(obj) === '[object Date]'