Javascript Object.toString()实际上是如何工作的?
请看下面的代码:Javascript Object.toString()实际上是如何工作的?,javascript,prototype,tostring,Javascript,Prototype,Tostring,请看下面的代码: function Foo() {} Foo.prototype.toString = function toString() { return "[object Foo]"; } var a = new Array(); var f = new Foo(); alert(a.toString()); // alerts [object Array] alert(f.toString()); // alerts [object Foo] alert(Object.pr
function Foo() {}
Foo.prototype.toString = function toString() {
return "[object Foo]";
}
var a = new Array();
var f = new Foo();
alert(a.toString()); // alerts [object Array]
alert(f.toString()); // alerts [object Foo]
alert(Object.prototype.toString.call(a)); // alerts [object Array]
alert(Object.prototype.toString.call(f)); // alerts [object Object]
对不起,我的英语不好 为什么f.toString()和Object.prototype.toString.call(f)有不同的结果 因为它们是不同的功能。第一个是您自己编写的,第二个是由JS引擎提供的 如何实现Foo.prototype.toString以在调用object.prototype.toString时返回[object Foo] 你不能
Object.prototype.toString
执行调用它时所执行的操作
另一个函数的存在不会改变Object.prototype.toString
的功能
为什么f.toString()和Object.prototype.toString.call(f)有不同的结果
因为它们是不同的功能。第一个是您自己编写的,第二个是由JS引擎提供的
如何实现Foo.prototype.toString以在调用object.prototype.toString时返回[object Foo]
你不能
Object.prototype.toString
执行调用它时所执行的操作
另一个函数的存在不会改变Object.prototype.toString的功能。重写prototype属性时,它不会在prototype中更新它,而是将属性添加到当前对象 调用函数时,编译器从对象开始,然后沿着原型链向上。因此,当您重写时,您的函数具有最高优先级。但当您执行
Object.prototype.toString.call
时,您是在显式调用prototype函数
样品
函数Foo(){
this.toString=函数(){
log('这是对象的函数');
}
}
Foo.prototype.toString=function(){
log('这是原型')
}
var f=新的Foo();
log(f)
当您重写prototype属性时,它不会在prototype中更新它,而是向当前对象添加属性
调用函数时,编译器从对象开始,然后沿着原型链向上。因此,当您重写时,您的函数具有最高优先级。但当您执行Object.prototype.toString.call
时,您是在显式调用prototype函数
样品
函数Foo(){
this.toString=函数(){
log('这是对象的函数');
}
}
Foo.prototype.toString=function(){
log('这是原型')
}
var f=新的Foo();
console.log(f)
为什么f.toString()和Object.prototype.toString.call(f)有不同的结果,是因为我们隐式地重写了Foo.prototype的toString方法,如果我们没有重写toString方法,那么f.toString()和Object.prototype.toString.call(f)会得到类似的结果
a.toString()和Object.prototype.toString.call(a)具有相同结果的原因是,这两种情况下的上下文是相同的,即变量a是一个数组。要调用的第一个参数设置执行的上下文。在这种情况下(Object.prototype.toString.call(a))是a
无法实现Foo.prototype.toString来在调用object.prototype.toString时返回[object Foo],因为当您重写prototype属性时,它不会在prototype中更新它,而是向当前对象添加属性。f.toString()和object.prototype.toString.call(f)的原因有不同的结果是因为我们隐式地重写了Foo.prototype的toString方法,如果我们没有重写toString方法,那么对于f.toString()和Object.prototype.toString.call(f),我们会得到类似的结果
a.toString()和Object.prototype.toString.call(a)具有相同结果的原因是,这两种情况下的上下文是相同的,即变量a是一个数组。要调用的第一个参数设置执行的上下文。在这种情况下(Object.prototype.toString.call(a))是a
无法实现Foo.prototype.toString以在调用object.prototype.toString时返回[object Foo],因为当您重写prototype属性时,它不会在prototype中更新它,而是向当前对象添加属性。Ok的可能重复项的可能重复项。。。我的意思是Object.prototype.toString可以检测实例的类型并返回:[Object Array][Object Date][Object RegExp]e.t.c.为什么它不能返回[Object Foo]?好的。。。我的意思是Object.prototype.toString可以检测实例的类型并返回:[Object Array][Object Date][Object RegExp]e.t.c.为什么它不能返回[Object Foo]?