Object.prototype.toString.apply(value)与value.toString()的不同之处是什么?

时间:2013-03-06 01:39:39

标签: javascript prototype

根据我的理解,前者会:

  1. 在对象
  2. 上找到toString方法
  3. value上调用它,但this绑定到value
  4. value.toString()会。

    1. toString的原型链
    2. 中找到value方法
    3. 通过函数调用模式将toString绑定到this的值作为值调用
    4. 所以不同的是,如果值中有一个被覆盖的toString方法......它会使用它。

      我的问题是:

      1. 这是唯一的区别吗?
      2. 相反,如果我们希望保证我们调用Parent的方法而不是被Child覆盖的某些方法,那么这种模式是否会使用标准模式? (在这种情况下,Parent = Object,Child =类值来自,如果我们正在考虑经典,并且method = toString。)

3 个答案:

答案 0 :(得分:6)

Object.prototype.toString.apple(value)可让您拨打null,当您使用null.toString()时,会产生错误。

Object.prototype.toString.apply(null);
>"[object Null]"

null.toString();
>TypeError: Cannot call method 'toString' of null

答案 1 :(得分:5)

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. 这不一定与父和子之间的关系有关..它只允许你用不同的对象上下文调用一个对象的方法(或任何函数)。

答案 2 :(得分:2)

是的,你做对了。我通常不会看到人们直接这样调用Object.prototype.toString(让对象覆盖他们的toString方法通常是有意义的)但它肯定非常常见,并推荐用于其他方法,如{{1 }}