2012-03-08 12 views
1

私は以下のコードを使用していますが、function(){}を使用して他のコードを見た後、thisキーワードを使用して、実際に下のオブジェクトをインスタンス化しましたか?javascriptの2つのOO方法論の違いは何ですか?

var MyObj = { 
propertyOne: 'a', 
      Method: (function() { 
       function MyFuncOne() {} 
       function MyFuncTwo() {} 
       return { 
        MyFuncOne: MyFuncOne, 
        MyFuncTwo: MyFuncTwo 
       } 
      })() 
     } 
+0

私はそのようなオブジェクトの構築を見たことがないので、私は、中にシャットなければなりませんが。 –

+0

もちろん、関数からオブジェクトを戻しています。しかし、少し変わったように見えます。 –

+0

@ジェフリースウィーニー:あなただけではありません。そのコードはまったく私には奇妙に見えます。私はそれがすべきことをしないと賭けるつもりです。 – cHao

答えて

2

私はこのような何かを行うための考えることができる唯一の理由は、あなたが(それはそれ法的javascriptを作るために変更した後)は、2つの機能の間で共有されたいくつかのプライベート変数を持っていると思った場合は次のとおりです。

var MyObj = (function() { 
     var x,y,z; // these will be accessible only to 
         // the MyFuncOne and MyFuncTwo functions 
     function MyFuncOneA() {} 
     function MyFuncTwoA() {} 
     return { 
      MyFuncOne: MyFuncOneA, 
      MyFuncTwo: MyFuncTwoA 
     } 
    })(); 

myObj = {{...}}があまり役に立たず、有効ではない可能性があるため、構文を変更して動作させる必要がありました。

これはプライベートではありますが、変数の概念を共有する以外に、はるかに明確な方法があるオブジェクト上の2つのメソッドを宣言するための単なる余計な(混乱する)構文です。

あなたはプライベート変数を使用していなかった場合は、上記の例では、機能的には私に多くの意味があります。このはるかに簡単な構文と同じです:

var MyObj = { 
    MyFuncOne: function() {}, 
    MyFuncTwo: function() {}   
}; 
2

はい、あなたはインスタンス化してきました"シングルトン"オブジェクトには2つの方法があります。

私は外側の中括弧は不要で、あなただけ書くことができると信じて:

var MyObj = 
    (function() { 
     function MyFuncOne() {} 
     function MyFuncTwo() {} 
     return { 
      MyFuncOne: MyFuncOne, 
      MyFuncTwo: MyFuncTwo 
     }; 
    })(); 

それを行うための別の方法がある:(function() { /* code here */ })()であなたのJSをラッピング

var MyObj = 
    (function() { 
     var obj = {}; 
     obj.MyFuncOne = function() {}; 
     obj.MyFuncTwo = function() {}; 
     return obj; 
    })(); 

は予防のための良い方法ですグローバルスコープに漏れる変数。この場合、それを使ってオブジェクトをアセンブルしています。

1

thisキーワードを持つ関数を使用すると、オブジェクトリテラル(これはあなたの匿名関数が返すもの)で可能な(あるいは、少なくとも簡単な)ことよりも多くのことを行うことができます。最も一般的には、「型」を作成する。

function Animal() { } 
Animal.prototype.speak = function() { 
    return ""; 
}; 
var dog = new Animal(); 
dog instanceof Animal; // returns true 

また、これは継承容易になります:

function Feline() { } 
Feline.prototype = new Animal; 
Feline.prototype.speak = function() { 
    return "meow"; 
}; 
function Lion() { } 
Lion.prototype = new Feline; 
Lion.prototype.speak = function() { 
    return "roar"; 
}; 
function Cat() { } 
Cat.prototype = new Feline; 
var leo = new Lion(); 
var baxter = new Cat(); 
leo.speak();  // returns "roar" 
baxter.speak(); // returns "meow" - from prototype chain 
leo instanceof Feline; // returns true 
leo instanceof Animal; // returns true 
leo instanceof Cat;  // returns false 

デモ:http://jsfiddle.net/hEnJf/

関連する問題