2010-12-07 8 views
1

私は名前空間として使用しているオブジェクトリテラルを作成しています。オブジェクトリテラル(名前空間)には、コンストラクタ関数MyConstructorが含まれています。私はオブジェクトリテラルの中でMyConstructorのプロトタイプを拡張したいと思います。 MyConstructorの宣言を取り除いてmyNamespaceの宣言の上に置くと、MyConstructorの名前空間がmyNamespaceでなくなってしまいますが、すべてがうまくいきます。この仕事をするにはどうすればいいですか? '。'の
が次のようにコンパイルされません。この行には:オブジェクトの内部にプロトタイプを宣言するリテラル

MyConstructor.prototype = { 

下記のオブジェクトリテラルがあります。

おかげで、 マイク

var myNamespace = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: function(xx) { 
     this.x = xx; 
    }, 
    MyConstructor.prototype = { 
     a: 1, 
     b: function() { 
      return true; 
     } 
    } 
}; 

更新:受け入れソリューションが動作します。しかし、私の質問の前提には欠陥がありました。このような状況では、私が知ったように単体テストは難しいので、私はオブジェクトリテラルを全く使用しません。代わりに、私はコンストラクタで作成された通常のオブジェクトを使用し、内部にプライベートオブジェクトを配置します。もう一つのことは、「自己/即座に実行する機能」ですが、いくつかの点では美しく、初心者に説明するのは少し難しいです。

答えて

5

あなたは単にオブジェクトリテラルでそれを行うことはできません。ごめんなさい。

回避策としては、関数を使用してmyNamespaceを作成します。それはリテラルである必要はありませんが、あなたはまだ、名前空間の効果を得ることができますこの方法:

var myNamespace = (function(){ 

    var ns = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: function(xx) { 
     this.x = xx; 
    } 
    }; 

    ns.MyConstructor.prototype = { 
    a: 1, 
    b: function() { 
     return true; 
    } 

    return ns; 
}()); 

だから何がここで起こるがMYNAMESPACEがすぐに呼び出される関数の値に設定されていることで、後の実際の名前空間オブジェクトを返します。他のコードは関数内のものにアクセスすることはできませんが、関数内にあるので、オブジェクトリテラルだけでなく何かを行うことができます。これはあなたの問題を解決;)

+0

あなたとmeouwは両方とも正確で、あなたは両方ともリアルタイムで回答しましたが、私はあなたの答えの1つだけを選ぶことができました。お二人のおかげです。 – Mike

5

ちょうどあなたのMyConstructorを返すジェネレータ関数を作成し、名前空間に

var myNamespace = { 
    myConstructor: function(x) { 
     this.x = x; 
    } 
} 

myNamespace.myConstructor.prototype = { 
    //... 
} 

それとも別のバリエーション

var myNamespace = (function(){ 

    function myConstructor(){} 

    myConstructor.prototype = {}; 

    return { 
     myConstructor: myConstructor 
    } 

})(); 
+0

Aw、これはもちろんもっとも簡単な方法です:)私のやり方は、複雑なヒンジが隠れている場合にも使用できますが、これは明らかにより簡単な解決策です。 – Jakob

+0

この例では動作します。問題は私の実際のオブジェクトリテラルがMyConstructorのプロトタイプのものを参照する他の関数を持っていることです。 – Mike

+0

私はヤコブが私の第2のバリエーションを提案しているのを見ます – meouw

0

どの程度を使用しています。 createMyConstructorという関数を作成してすぐに呼び出すと、必要なものが返されます。

var myNamespace = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: (function createMyConstructor() { 
     var cons = function(xx) { 
      this.x = xx; 
     }; 
     cons.prototype = { 
      a: 1, 
      b: function() { 
       return true; 
     }; 
     return cons; 
    })() 
}; 
関連する問題