Object.method(o)
Object
オブジェクト ( Object
JavaScript では実際のオブジェクト) で呼び出されたプロパティを検索しmethod
、変数を渡してそれを呼び出そうとしますo
。通話中は、this
になりますObject
。
o.method()
o
は、呼び出されたプロパティの変数によって参照されるオブジェクトを調べ、method
何も渡さずにそれを呼び出そうとします。呼び出し中this
、o
.
ご覧のとおり、彼らはまったく異なることをしています。
特定のオブジェクトのすべてのメソッドは、実際のオブジェクト インスタンスから、またはオブジェクトをObject.method()
引数として渡すことによって呼び出すことができることに気付きました。
いいえ、できません。あなたの例は、呼び出されるプロパティがないため、関数として呼び出すことができないためArray.reverse(a)
、の標準実装で失敗します。編集:Firefoxのスクラッチパッドで動作することをコメントで指摘しましたが、私はそれを確認しました。これは、Firefox の SpiderMonkey JavaScript エンジンが、 の静的実装を提供する非標準の拡張機能を適用していることを意味します。これは Firefox に固有のものであり、すべてのオブジェクトに一般的なものではありません。(たとえば、独自の を作成した場合、そのプロトタイプ関数も魔法のように追加されません。)Array
Array
reverse
Array
reverse
Array
Foo
Foo
ほぼ同等のものを作成する標準的なa.reverse()
方法は、次のようにプロトタイプを使用することです。
Array.prototype.reverse.call(a);
それは標準のエンジンで機能します。それでは、それが何をするか見てみましょう:
prototype
からプロパティを取得しますArray
。
reverse
#1で取得したオブジェクトからプロパティを取得します。
Function#call
JavaScript 関数オブジェクトの機能を使用してプロパティが参照する関数を呼び出し、関数呼び出しの過程でthis
渡される引数にします。call
配列を作成すると、オブジェクトは基礎となるプロトタイプを取得します。そのプロトタイプはArray.prototype
、新しい配列が作成されるときに参照されるオブジェクトです。基になるプロトタイプにプロパティがあるため、Soa
にはプロパティがあります。reverse
reverse
これを行うと、次のようになりa.reverse()
ます。
reverse
オブジェクトからプロパティを取得しa
ます。(通常)a
と呼ばれる独自のプロパティを持たないためreverse
、標準の JavaScript プロパティ ルックアップはa
の基礎となるプロトタイプを参照します。そこでプロパティを見つけ、その値を使用します。
this
呼び出し内にあるように機能a
する呼び出し。
ご覧のとおり、基本となるプロトタイプが同じオブジェクトを参照していれば、最終結果は同じです。(そうしないことは可能ですが、または他の組み込みの場合、誰かが[ augmentingではなく]を置き換えた場合、それは Bad Thing (tm)になります。)a
Array.prototype
Array
Array.prototype