2016-06-29 8 views
0

javascriptで新しいキーワードを使用すると同じインスタンスを取得できますか?私はそれが同じオブジェクトを返すようにテスト関数で何かをすることが可能かどうかを考えているのは良い考えではないことを知っています。新しいkeywoardを使用しますが、1つのインスタンスを返します

var a = new Test(); 
var b = new Test(); 
a == b // should give true 
+0

可能ですが、行うべきではありません。なぜあなたはそのような悪いことを達成したいのですか? –

+0

可能かどうかを知りたかっただけです。私は実際のケースでそれを使用するつもりはありません – Arin

答えて

2

はJavaScriptで新しいキーワードを使用した場合、同じインスタンスを取得することが可能ですか?

はい:

var a, 
 
    b; 
 

 
function Test() { 
 
    if (Test._instance) { 
 
    return Test._instance; 
 
    } 
 
    Test._instance = this; 
 
} 
 

 
a = new Test(); 
 
b = new Test(); 
 

 
console.log(a === b);

私はそれは良いアイデア&hellipではありません知っています。

これはJavaScriptのSingleton (anti)patternの実装として書かれています。あなたはそれが良い考えではないという点で正しいです。実際には、と決してを使用することをお勧めします。 JSで利用可能なパターンはずっと優れており、常に同じデータを返すコンストラクタもプレーンな関数である可能性があります。

var getTest, 
 
    a, 
 
    b; 
 

 
getTest = (function() { 
 
    var test; 
 
    function Test() { 
 
    } 
 

 
    function getTest() { 
 
    if (!test) { 
 
     test = new Test(); 
 
    } 
 
    return test; 
 
    } 
 
    
 
    return getTest; 
 
}()); 
 

 
a = getTest(); 
 
b = getTest(); 
 

 
console.log(a === b);

+1

シングルトン(このパターン)は、グローバル変数に依存している悪いデザインを促進するので、悪い習慣とみなされます。それを使用するときは注意してください! –

+0

@MadaraUchiha、それはすでに質問で言及されました。私は間もなくそれを私の答えに加えていくつもりです、 "はい"はかなり簡潔な答えです。 – zzzzBov

-2

ことが可能です。ある関数から値を返すと、new演算子は新しいオブジェクトではなくそのオブジェクトを返します。

var testInstance = {name:"test"}; 
 
function Test() { 
 
    return testInstance; 
 
} 
 

 
var a = new Test(); 
 
var b = new Test(); 
 

 
console.log(a === b);

+0

それはだまされています。あなたのコンストラクタは実際にコンストラクタではなく、他のコンストラクタのようにそれにロジックを追加することはできません。 –

+0

@MadaraUchihaコンストラクタはjavascriptの単なる関数です。 「本当のコンストラクターではない」とは言い切れません。さらに、この質問には「コンストラクタ」という言葉もありませんでした。とにかく毎回同じオブジェクトを返す関数にロジックを追加するのはなぜですか?正当な理由は、遅延初期化シングルトンが必要な場合です。しかし、その場合は、コンストラクタを公開しないでください。一度実行されるロジックを望むなら、関数の宣言の後に置くことができ、必要に応じて 'testInstance'を設定します。しかし、もちろん、あなたがすでにこのすべてを知って、私はちょうどたぶん私は「コンストラクタ」のようなものがあります。もちろん、私の答え –

+0

を守りたかった、それはあなたが 'newで呼び出す機能です演算子。そして、あなたはあなたの消費者に供給契約は、あなたが 'を呼び出すときnew'あなたは、多くの場合、あなたはパラメータに渡す初期状態のいくつかの並べ替えで、新しいオブジェクトを取得することです。あなたは手で初期化した 'Test'への最初の呼び出しでオブジェクトを初期化しませんでした。 –

0

あなたのコードの問題は、それが直感的だということです。 のたびにnewが新しいインスタンスを返すことが予想されます。それでもあなたの正確なコードでそれをしたい場合は、zzzzBovの答えを使用してください。

私は代替APIを提案:

function Test() { 
    // my constructor 
} 

Test.getInstance =() => { 
    if (!Test._instance) { Test._instance = new Test(); } 
    return Test._instance; 
} 

そして

const a = Test.getInstance(); 
const b = Test.getInstance(); 

console.log(a === b); // true 

と呼んこれはしかしnew Test()への直接呼び出しに対してあなたを保護しないので、バイパスすることができます。真の単一のインスタンスを強制するには、閉鎖の後ろTestを隠す:

const getTestInstance = (() => { 
    function Test() { 
    // my constructor 
    } 

    let instance; 

    const getInstance =() => { 
    if (!instance) { instance = new Test(); } 
    return instance; 
    } 

    return getInstance; 
})(); 

は今だけgetTestInstanceが露出している、あなたはもうnew Test()を使用することはできません。

注:このコードを書いても、私は私の口の中で少し噛み付いていました。すべてのオプションを評価し、デザインにシングルトンを導入する際の価格を知っていない限り、使用しないでください。

関連する問題