Javascript Object.toString()实际上是如何工作的?

时间:2016-10-25 10:41:13

标签: 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.prototype.toString.call(a)); // alerts [object Array]
alert(Object.prototype.toString.call(f)); // alerts [object Object]
  1. 为什么 f.toString() Object.prototype.toString.call(f)会有不同的结果?为什么 a.toString() Object.prototype.toString.call(a)会有相同的结果?

  2. 如何在 Object.prototype.toString 上实现 Foo.prototype.toString 返回 [object Foo] ?如何获得与本机类型相同的行为(数组,日期,布尔等)

  3. 抱歉我的英语不好......

3 个答案:

答案 0 :(得分:0)

  

为什么f.toString()和Object.prototype.toString.call(f)会有不同的结果?

因为它们的功能不同。你自己写的第一个,第二个是由JS引擎提供的。

  

如何实现Foo.prototype.toString以在调用Object.prototype.toString时返回[object Foo]?

你做不到。

var HtmlCode = '<div></div>' var dataArgs = '{' + '"code": "' + HtmlCode + '"}'; var request = $.ajax({ url: '@Url.Action("MethodName", "controllerName")', type: "POST", headers: headers, contentType: "application/json; charset=utf-8", data: dataArgs, dataType: "json" }); request.done(function (msg) { //success }); request.fail(function (jqXHR, textStatus) { alert('Error submitting request.'); }); 执行Object.prototype.toString调用后的操作。

另一个函数的存在不会改变Object.prototype.toString的作用。

答案 1 :(得分:0)

当您覆盖原型属性时,它不会在原型中更新它,而是向当前对象添加属性。

调用函数时,编译器以object开头,然后上传原型链。因此,当您覆盖时,您的函数具有最高优先级。但是当你执行Object.prototype.toString.call时,你明确地调用了原型函数

示例

function Foo(){
  this.toString = function(){
    console.log('This is object\'s function');
  }
}

Foo.prototype.toString= function(){
  console.log('This is prototype')
}

var f = new Foo();
console.log(f)

以下是原型链:

enter image description here

答案 2 :(得分:0)

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))的情况下,它是一个。

无法实现Foo.prototype.toString在调用Object.prototype.toString时返回[object Foo],因为当您覆盖原型属性时,它不会在原型中更新它,而是在当前属性中添加属性对象