私はjavascriptのプロトタイプについて読んでいます。記事http://phrogz.net/js/classes/OOPinJS.htmlで、javascriptのオブジェクトコンストラクター内でパブリックメソッドを割り当てることができないと読みましたか?プロトタイプメソッドは静的メソッドとどのように異なり、それらを使用する利点は何ですか?
3 に答える
JavaScriptは、特に継承をエミュレートしようとすると、ほとんどのOOPの概念やパラダイムにはあまり適していません。OOP用語でプロトタイプと「特権」メソッドを考えるのではなく、JavaScriptがオブジェクトをインスタンス化する方法の観点から物事を考える必要があります。この単純な「クラス」を取る:
var id = 0;
function myClass()
{
var that = this;
id++; //closure, each new instance gets a unique id
this.id = id;
this.toString = function()
{
return that.id.toString();
}
}
そして、このクラスは次のようにインスタンス化されます。
var classInstance = new myClass();
これは必ずしもお勧めするパターンではありません。重要なのは、インスタンス化ごとに、各インスタンスが独自のtoString
関数を取得することを説明することです。つまり、100をインスタンス化し、そのうちの1つclassInstances
を変更toString
して別のことを行うと、その1つのインスタンスだけがその新しい機能を持ちます。
これは、すべてのインスタンスについて、すべての特権メソッドも一緒にインスタンス化されることも意味します。多くのインスタンスをインスタンス化する場合、パフォーマンスに大きな違いが生じる可能性があります。特権メソッドをプロトタイプメソッドに変換することで、測定可能な速度の向上が見られた場合がありました。
プロトタイプメソッドと言えば、次のようになります。
var id = 0;
function myClass()
{
id++; //closure, each new instance gets a unique id
this.id = id;
}
myClass.prototype.toString = function()
{
return this.id.toString();
}
この場合、いくつmyClasses
持っていても、メソッドをインスタンス化するのはtoString
1回だけです。そしてそれが変わると、それはすべてのために変わりますmyClasses
。
個人的には、ほとんどのJavaScriptクラスで特権メソッドを使用しています。これは、見た目がすっきりしていて、プロトタイプチェーンが何度もインスタンス化されることがわかっている場合にのみ、プロトタイプチェーンに煩わされるためです。また、プライベート変数にアクセスできることで、アクセスされた変数をパブリックにすることを強制されるのではなく、情報を隠蔽するように見せることができます。
javascriptのオブジェクトコンストラクター内でパブリックメソッドを割り当てることができないことを読みましたか?
はい、記事はこれに言及しています:
function MyObj(name)
{
this.name = name;
}
MyObj.prototype.sayHello = function() {
alert('hello ' + this.name);
}
new MyObj('world').sayHello();
ご覧のとおり、パブリックメソッドsayHello()
はプロトタイプで宣言されており、コンストラクターの外部で実行されます。これがJavaScriptの仕組みです。
プロトタイプメソッドは静的メソッドとどのように異なり、それらを使用する利点は何ですか?
プロトタイプメソッドは、オブジェクトに「アタッチ」されるだけです。静的メソッドの場合、次の構成を使用する必要があります。
var MyStaticThing = {
name: 'world',
sayHello: function() {
alert('hello ' + this.name);
}
}
MyStaticThing.sayHello();
「それらを使用する利点」...あなたはどちらを参照していますか?一般的に、JavaScriptの静的メソッドや古典的なメソッドのようなものよりも、プロトタイプのメソッド(および一般的にはオブジェクトの構築)を使用する方が有利です。あなたが探している答えはここで扱うには本当に長すぎますが、短い答えは、javascriptはプロトタイプのオブジェクト継承システムに基づいているということです(つまり、オブジェクトはその場で作成でき、一方を他方に継承できます)。従来のシステム(オブジェクトはクラス、つまりJava、C ++などからのみ継承できます)
古典的な方法でjavascriptでオブジェクトを作成することはできますが、言語は非常に柔軟であるため、それを行うには不適切で混乱した方法です。プロトタイプのオブジェクト構築を使用すると、データの非表示、スーパーメソッドへのアクセスなど、重要で優れた処理を実行できます。前述のように、これは冗長な主題であり、小さなテキストボックスで実行するのは非常に重要です。