7

私が理解していることから、前者は次のようになります。

  1. toStringオブジェクトでメソッドを検索します
  2. それを呼び出しますvaluethisvalue

そしてvalue.toString()意志。

  1. のプロトタイプチェーンのtoStringどこかでメソッドを見つけますvalue
  2. 関数呼び出しパターンを介して値としてtoStringバインドされた値を呼び出すthis

したがって、違いはtoString、値にオーバーライドされたメソッドがある場合です...それを使用します。

私の質問は:

  1. それが唯一の違いですか?
  2. 逆に、このパターンは、のメソッドを呼び出していることを保証したい場合に使用する標準パターンでParentあり、潜在的に一部がオーバーライドされないようにしChildますか?(この場合、Parent = Object、Child =クラス値は、古典的に考えている場合は元になり、method = toStringになります。)
4

3 に答える 3

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
于 2013-03-06T01:44:47.487 に答える
5

Object.prototype.toStringvalue.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. これは、必ずしも親と子の関係とは関係ありません。別のオブジェクトコンテキストで1つのオブジェクトのメソッド(または任意の関数)を呼び出すことができます。
于 2013-03-06T01:49:01.767 に答える
2

はい、あなたはこれを正しく理解しました。私は通常、Object.prototype.toStringそのように直接呼び出す人を見ることはありませんが(通常、オブジェクトにメソッドをオーバーライドさせることは理にかなっていますtoString)、確かに非常に一般的であり、のような他のメソッドに推奨されObject.prototype.hasOwnPropertyます。

于 2013-03-06T01:43:19.343 に答える