2012-02-26 8 views
5

私が知る限り、javascriptでオブジェクトの関数を作成する主な方法は2つあります。それらは:あなたがやった場合は明らかにjavascriptでオブジェクトの関数を作成する

function MyObject() { 
    ... 
} 

MyObject.prototype.myFunc1 = function() { 
    ... 
} 

MyObject.prototype.myFunc2 = function() { 
    .... 
} 

::、

function MyObject() { 
    this.myFunc1 = function() { 
     ... 
    } 
    this.myFunc2 = function() { 
     ... 
    } 
    ... 
} 

方法Bのプロトタイプに追加します。

方法Aは、コンストラクタでそれを作る

MyObject.myFunc3 = function() { 
    .... 
} 

そしてmyFunc3はMyObject自体に関連付けられ、で作成された新しいオブジェクトは関連付けられませんキーワード。わかりやすくするために、newキーワードで新しいオブジェクトを作成することはできませんが、メソッドCとします。

この2つの違いは何ですか?私が言う限りでは、マシン上で起こっていることが異なっていても、論理的には同じ効果があります。

私が推測するなら、唯一の違いは、メソッドAのようにコンストラクタでそれらを定義すると、作成された各オブジェクトに対してまったく新しい関数オブジェクトが作成され、それが呼び出されたときにいつでも参照するMyObject内の1つのコピーです。これが事実なら、なぜあなたはそれを他のものよりもうまくやりますか?それ以外の場合は、メソッドAとメソッドBの違いは何ですか?

+0

[this](http://jsfiddle.net/uwv5a/) –

+0

のようなオブジェクトに関数を作成して、モジュールパターンについても読むことができます:http://www.engfers.com/code/javascript-module-pattern/ – bryanmac

+0

@CoreyFarwell、私はそれが基本的に方法Aと同じことをすると思います、はい? –

答えて

4

各オブジェクトに別々の関数を与える利点は、コンストラクタ内の変数を閉じることができ、基本的に「プライベートデータ」を許可することです。

function MyObject(a,b) { 
    var n = a + b; //private variable 
    this.myFunc1 = function() { 
     console.log(n); 
    } 
}; 

これはあなたが尋ねる人に依存して良いアイデアであるかどうかは

function MyObject(a,b) { 
    this.n = a + b; //public variable 
} 

MyObject.prototype.myFunc1 = function() { 
    console.log(this.n); 
} 

対。私の個人的な立場は、オプション#2のように実際にプロトタイプを使用し、オプション#1のようにクロージャを使用するときに普通の関数(たとえば、make_my_object(a,b))を使用するコンストラクタ関数を予約しています。

2

プロトタイプはいつでも変更でき、そのタイプのすべてのオブジェクト(変更前に作成されたオブジェクトも含む)が変更を継承するという考えがあります。これは、前述したように、プロトタイプが新しいインスタンスごとにコピーされないためです。

0

方法AのMyObjectは、内部機能用のインスタンスです。 オブジェクト(クラスとも呼ぶことができます)がインスタンス化されていない限り、その関数を明示的に呼び出すことはできません。

MyObject.MyFunc1(); // will not work 
var obj = new MyObject(); 
obj.MyFunc1(); // will work 

ので、これは他の言語のいずれかのクラスと同じである:

はこれを仮定します。クラスの有用性とその使用法を記述することは、その質問を超えています。

も注意する:方法Bについて

function MyObject() { 
     var privateVar = "foo"; 

     this.publicProperty = "bar"; 

     // public function 
     this.publicFunc = function() { 
      ... 
     } 

     // private function 
     function privateFunc() { 
      ... 
     } 
    } 

それは方法Aと同じだが、唯一の違いは、プロトタイピングであるオブジェクトを作成するためのスタイルです。いくつかは、読みやすさのために、あるいは好みのためにプロトタイプを使用しています。 プロトタイプの主な利点は、元のソースに触れることなく既存のオブジェクトを拡張できることです。あなたはそれに注意する必要があります。 (サンプルプロトタイプフレームワークとして)

のメソッドCでは、静的関数を呼び出すことができます。あなたは彼らが好きオブジェクトを介して参照することによって明示的に呼び出すことができます言ったように:

MyObject.MyFunc1(); 

だから、どちらが使用することをお取り扱いしている状況に依存します。

+0

メソッドBではメソッドもインスタンスメソッドです。彼の仮説的でラベル付けされていない「方法C」と混同されましたか? – hugomg

+0

@missingnoあなたがポイントだと思う。 'new'キーワードで新しいオブジェクトを作成するために実際には動作しませんが、明示的にそれをメソッドcとしています。 –

+0

@ミッシング・ノー、申し訳ありません。どういうわけか、プロトタイピングは私の目の前で滑りました。訂正された回答 –

関連する問題