假设我已经创建了一个函数构造函数,例如
function Bar(){
}
var obj = new Bar();
是否可以让Object.prototype.toString.call(obj)
返回类似[object Date]
的内容?
答案 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]'