JavaScriptは、クラスのようなオブジェクトのメソッドまたはプロパティを定義する方法としてObject.prototype
を定義します。Object.prototype/JavaScriptインスタンスメソッドを使用する場合
Object.prototype
を使用する方法は、呼び出し元のコンテキストを持つことになりますthis
としてコールバックを経由して呼び出される
間違った
行動があるときに存在する大きな問題。
function Foo() {}
Foo.prototype.resize() {
console.log(this);
}
var foo = new Foo();
window.on('resize', foo.resize);
この制限を回避するために、以下のことができます。このような状況を考えると
function Foo2() {
function resize() {
console.log(self);
}
var self = this;
this.resize = resize;
}
var foo2 = new Foo2();
window.on('resize', foo2.resize);
我々はObject.prototype
施設を使用する必要があるとき、それはにましだように思える常には、このように例では2
をクラスのようなオブジェクトを定義しますか?つまり、あなたのメソッドがどのように呼び出されるかを先験的に知ることはできません。そして、呼び出されたときにコンテキストの参照が正しいことが最も確実です。
サポート状況:あなたはObject.prototype
を使用して、インスタンス・メソッドを作成しているようにそれはそうと、私はこの質問を考えました。しかし、図示のとおり、あなたはそうではありません。インスタンスへの「実際の」接続がないメソッドを作成するだけです。したがって、インスタンスにバインドされたメソッドを作成するためにクロージャを使用する必要があります。さらに、この質問はthis excellent explanation of this
を読んだ後に考えられた。
は、あなただけの 'window.on( 'リサイズ'、foo.resize.bind(FOO))をしないだろう;' ?それが起こっている理由は、 'this'は実行コンテキストに完全に依存し、イベントハンドラではその関数が参照され、ハンドラによって呼び出されるからです。 – adeneo
あなたは 'this'の使用を完全に禁じることができます... – evolutionxbox
プロトタイプの最大の利点はメモリ節約です。特定のタイプのインスタンスを100万個作成することができます。プロトタイプを使用する場合は、各関数のコピーは1つのみです。クロージャーアプローチを使用すると、すべての機能のわずかに異なるコピーが作成されます。私がJavaScriptで定義するオブジェクトは、 'this 'が引き起こすすべての混乱とバグのためにプロトタイプや' this'を使用しませんが、プロトタイプのメモリ節約の利点を否定することはできません。 – JLRishe