2013-06-28 18 views
6

最近私はJavaScriptに深く没頭し、質問に遭遇しました。JavaScriptオブジェクトの3種類の違いは何ですか?

オブジェクトの以下の実装の違いは何ですか:

var myFunction1 = (function myFunction1() {})(); 

var myFunction2 = {} 

var myFunction3 = function myFunction3() {} 

それともまったく同じタスクを予備成形する3つの実装の長い例では。

<script> 
    var myFunction1 = (function myFunction1() { 

     var _privateVar = 'Private var'; 
     this.publicVar = 'Public var'; 

     function init(newPrivate, newPublic) { 
     _privateVar = newPrivate; 
     this.publicVar = newPublic; 
     } 

     function getPrivateVar(){ 
     return _privateVar; 
     } 

     function setPrivateVar(string){ 
     _privateVar = string; 
     } 

     return { 
     init: init, 
     getPrivateVar: getPrivateVar, 
     setPrivateVar: setPrivateVar 
     } 

    })(); 

    var myFunction2 = { 

     _privateVar: 'Private var', 
     publicVar: 'Public var', 

     init: function init(newPrivate, newPublic) { 
     this._privateVar = newPrivate; 
     this.publicVar = newPublic; 
     }, 

     getPrivateVar: function getPrivateVar(){ 
     return this._privateVar; 
     }, 

     setPrivateVar: function setPrivateVar(string){ 
     this._privateVar = string; 
     } 

    } 

    var myFunction3 = function myFunction3() { 

     var _privateVar = 'Private var'; 
     this.publicVar = 'Public var'; 

     function init(newPrivate, newPublic) { 
     _privateVar = newPrivate; 
     this.publicVar = newPublic; 
     } 

     function getPrivateVar(){ 
     return _privateVar; 
     } 

     function setPrivateVar(string){ 
     _privateVar = string; 
     } 

     return { 
     init: init, 
     getPrivateVar: getPrivateVar, 
     setPrivateVar: setPrivateVar 
     } 

    } 

    var a, b, c; 
    a = myFunction1; 
    a.init('Private var updated', 'Public var updated'); 
    console.log('== A =='); 
    console.log(a.publicVar); // Public var updated 
    console.log(a._privateVar); // undefined 
    console.log(a.getPrivateVar()); // Private var updated 
    a.setPrivateVar('Private var is updated again'); 
    console.log(a.getPrivateVar()); // Private var is updated again 

    b = myFunction2; 
    b.init('Private var updated', 'Public var updated'); 
    console.log('== B =='); 
    console.log(b.publicVar); // Public var updated 
    console.log(b._privateVar); // Private var updated 
    console.log(b.getPrivateVar()); // Private var updated 
    b.setPrivateVar('Private var is updated again'); 
    console.log(b.getPrivateVar()); // Private var is updated again 

    c = new myFunction3(); 
    c.init('Private var updated', 'Public var updated'); 
    console.log('== C =='); 
    console.log(c.publicVar); // Public var updated 
    console.log(c._privateVar); // undefined 
    console.log(c.getPrivateVar()); // Private var updated 
    c.setPrivateVar('Private var is updated again'); 
    console.log(c.getPrivateVar()); // Private var is updated again 
</script> 

2つの最初の例はシングルトンで、最後に複数のオブジェクトを作成することができます。しかし、最初の2つの違いは何ですか?または、彼らは同じですか、少し書いただけですか?

+1

最初の例では、 'var myFunction1 =(function myFunction1(){})();'はオブジェクトを与えません。関数の戻り値をmyFunction1に格納します。 – nderscore

+0

@nderscoreはい、myFunction2とまったく同じことをやっていませんか? – jamietelin

+1

いいえ。 myFunction2は関数ではありません。 – SLaks

答えて

5

最初の例では、機能myFunction1()を作成し、それを実行し、変数myFunction1もたらす(非関数)を格納 - (それが実行いたら)、この場合、myFunction1まずそれに含まその後、関数を含みます結果。

myFunction2はまったく機能ではありません。角括弧{}はオブジェクトリテラルであり、空のオブジェクトを作成します。

myFunction3は、この例では唯一の機能です。この場合、何もしません。

+0

私は入力が遅すぎて、答えが答えの半分を私に拾いました。誰かがこの答えを改善したい場合は、それを持ってください。 – iamnotmaynard

1

最初の例では、プライベート状態を維持するためにIIFE(immediately-invoked function expression)を使用しています。

IIFE内で宣言された変数がクロージャ内にあるため、_privateVarにアクセスすることはできません。

+0

myFunction2内で宣言されている_privateVarにアクセスすることはできません。しかし私は、私の2番目の例はまったく機能ではないという事実を得ています。しかし、機能的な違いは何ですか?同じタスクを実行しますか? – jamietelin

+0

@jamietelin:えええええ、私はあなたがmyFunction2の_privateVarにアクセスできることを確認できます。これは機能的な違いです –

+0

コードをコピー/ペーストしてテストしましたか?私は未定義です(私の質問を出力で更新しました) – jamietelin

関連する問題