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)有不同的结果?为什么a.toString()Object.prototype.toString.call(a)具有相同的结果

  • 如何实现Foo.prototype.toString以返回[object Foo]待命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
    的功能

    为什么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]?