Object.prototype.toString.apply(value)与value. tostring()有何不同

How is Object.prototype.toString.apply(value) different from value.toString()?

本文关键字:value tostring 何不同 prototype toString Object apply      更新时间:2023-09-26

据我所知,前者将:

  1. 查找对象
  2. 上的toString方法
  3. value上调用,但thisvalue绑定

value.toString()将。

  1. value的原型链中找到toString方法
  2. 通过函数调用模式以this作为值调用toString

所以不同的是,如果有一个覆盖的toString方法的值…它会使用这个

我的问题是:
  1. 这是唯一的区别吗?
  2. 相反,如果我们想要保证我们调用Parent的方法而不是可能被Child覆盖,那么这种模式是标准模式吗?(在这种情况下,父=对象,子=类值来自,如果我们考虑经典,和方法= toString。)

Object.prototype.toString.apple(value)将允许您调用null,当您使用null.toString()时,它将产生一个错误。

Object.prototype.toString.apply(null);
>"[object Null]"
null.toString();
>TypeError: Cannot call method 'toString' of null

Object.prototype.toString可以是与value.toString()不同的方法,这取决于后者是什么。

> Object.prototype.toString.apply("asdfasdf")
"[object String]"
> "asdfasdf".toString()
"asdfasdf"
> Object.prototype.toString.apply(new Date)
"[object Date]"
> (new Date).toString()
"Tue Mar 05 2013 20:45:57 GMT-0500 (Eastern Standard Time)"

.prototype[function].apply(或.call.bind)允许您更改方法的上下文,即使上下文可能根本没有这样的方法。

var o = {};
o.prototype = {x: function () { console.log('x'); }}
var y = {}
o.prototype.x.call(y)
y.x(); //error!

…也就是说

  1. 这不是唯一的区别
  2. 这并不一定与父母和孩子之间的关系有关。它只是允许你用不同的对象上下文调用一个对象的方法(或任何函数)。

是的,你说对了。虽然我不经常看到人们这样直接调用Object.prototype.toString(让对象覆盖它们的toString方法通常是有意义的),但这当然是非常常见的,并推荐用于其他方法,如Object.prototype.hasOwnProperty