admin管理员组

文章数量:1289830

From what I understand, the former will:

  1. Find the toString method on Object
  2. call it on value but with this bound to value

And value.toString() will.

  1. Find the toString method somewhere in value's prototype chain
  2. Call toString on value bound with this as value via the function invocation pattern

So the difference is if there is an overridden toString method in value... it will use that.

My question is:

  1. Is that the only difference?
  2. Conversely, is this pattern the standard pattern to use if we want to be guaranteed we're calling Parent's method and not potentially some overridden by Child? (In this case Parent = Object, Child = the class value es from, if we're thinking classically, and method = toString.)

From what I understand, the former will:

  1. Find the toString method on Object
  2. call it on value but with this bound to value

And value.toString() will.

  1. Find the toString method somewhere in value's prototype chain
  2. Call toString on value bound with this as value via the function invocation pattern

So the difference is if there is an overridden toString method in value... it will use that.

My question is:

  1. Is that the only difference?
  2. Conversely, is this pattern the standard pattern to use if we want to be guaranteed we're calling Parent's method and not potentially some overridden by Child? (In this case Parent = Object, Child = the class value es from, if we're thinking classically, and method = toString.)
Share Improve this question edited Mar 6, 2013 at 1:45 djechlin asked Mar 6, 2013 at 1:39 djechlindjechlin 60.8k39 gold badges171 silver badges300 bronze badges 2
  • I don't understand your last paragraph. What are you asking? – Explosion Pills Commented Mar 6, 2013 at 1:44
  • @ExplosionPills thanks, edited to hopefully be more clear. – djechlin Commented Mar 6, 2013 at 1:46
Add a ment  | 

3 Answers 3

Reset to default 6

Object.prototype.toString.apple(value) will let you call on null, while you use null.toString(), it will produce an error.

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

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

Object.prototype.toString can be a different method than value.toString() depending upon what the latter is.

> 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 (or .call or .bind) allow you to change the context of a method even though the context may not have such a method at all.

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

...so that is to say that

  1. It's not the only difference
  2. This doesn't necessarily have to do with a relationship between parent and child .. it just allows you to call one object's method (or any function) with a different object context.

Yes, you got this right. I don't usually see people calling Object.prototype.toString directly like that though (it usually makes some sense to let objects override their toString method) but its certainly very mon and remended for some other methods like Object.prototype.hasOwnProperty.

本文标签: javascriptHow is ObjectprototypetoStringapply(value) different from valuetoString()Stack Overflow