Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以在JavaScript中更改对象类型的名称吗?_Javascript_Oop - Fatal编程技术网

可以在JavaScript中更改对象类型的名称吗?

可以在JavaScript中更改对象类型的名称吗?,javascript,oop,Javascript,Oop,例如: Object.prototype.toString.call(new Date); // [object Date] Object.prototype.toString.call(new Array); // [object Array] Object.prototype.toString.call(new Object); // [object Object] 现在考虑一下: var PhoneNumber = function(number) { this.number =

例如:

Object.prototype.toString.call(new Date); // [object Date]
Object.prototype.toString.call(new Array); // [object Array]
Object.prototype.toString.call(new Object); // [object Object]

现在考虑一下:

var PhoneNumber = function(number) {
    this.number = number;
}
我可以重写
toString()
方法,但它实际上并不重命名对象类型。只是有点假:

PhoneNumber.prototype.toString = function() {
    return '[object PhoneNumber]';
}

new PhoneNumber().toString(); // [object PhoneNumber]
然而,l33t H4x0R知道我的
toString()
方法是个谎言,我是n00b:

Object.prototype.toString.call(new PhoneNumber); // [object Object]
无论原型上覆盖了
toString()
方法,我希望结果是什么:

 Object.prototype.toString.call(new PhoneNumber); // [object PhoneNumber]

这可能吗?

ECMAScript 2015规范定义了一个众所周知的
符号,可用于控制此行为:。不幸的是

一旦它得到支持,您就可以这样使用它:

PhoneNumber.prototype[Symbol.toStringTag] = 'PhoneNumber';
这将产生您预期的行为:

new PhoneNumber().toString(); // [object PhoneNumber]
Object.prototype.toString.call(new PhoneNumber); // [object PhoneNumber]

因为Object.prototype.toString返回类的[[Class]]内部属性,[[Class]]内部属性的值由es5规范为每种内置对象(如Date、Regexp.)定义。。 在规范中,您无法找到任何访问此属性的方法。 此属性用于设置内置对象之间的差异,因此重写toString不能更改[[Class]]属性,结果始终为[object]。
更详细的toString工作原理

是。但让我先解释一下问题:您使用的不是类的
.toString()
,而是
对象的
toString()
,它有自己的定义,并且不返回对象的
toString()

我有两个解决方案*:(都在Edge、Chrome、Firefox和IE9-11中测试过)

解决方案A

Object.prototype.toString=(函数(f){
返回函数(){
返回(this.toString==Object.prototype.toString
||/\{\s*\[本机代码\]\s*\}/.test(this.toString.toString())
)调用(this):this.toString()
}
})(Object.prototype.toString)//或者只是{}.toString
var PhoneNumber=函数(编号){
这个数字=数字;
}
PhoneNumber.prototype.toString=函数(){
返回“[对象电话号码]”;
}
document.writeln(Object.prototype.toString.call(新电话号码))
document.writeln(Object.prototype.toString.call(Function()))
document.writeln(Object.prototype.toString.call(Array()))
document.writeln(Object.prototype.toString.call(窗口))
document.writeln(Object.prototype.toString.call(新日期))
document.writeln(Object.prototype.toString.call(1))
document.writeln(Object.prototype.toString.call(null))
document.writeln(Object.prototype.toString.call(“”))
document.writeln(Object.prototype.toString.call(document))
document.writeln(Object.prototype.toString.call(document.createElement(“div”))
document.writeln(Object.prototype.toString.call(Object()))

document.writeln(({}).toString())//检查在泛型对象上中断toString的
({})。toString()
将导致调用堆栈超出错误。@NoahFreitas修复了此功能可用的问题,因此它应该在今年的某个时候进入Node和Chrome。