2017-09-28 16 views
0

2 IFFE:それ私が持っている

var Helper = (function() { 
    return { 
     number: null, 
     init: function (num) { 
      number = num; 
     } 
    } 
})(); 

var Helper2 = (function() { 
    return { 
     options: { 
      number: [], 
     }, 
     init: function(num){ 
      this.options.number = num; 
     }, 
     getData: function() { 
      return this.options.number; 
     } 
    } 
})(); 


Helper2.init(Helper.number); 
console.log(Helper2.getData()); 
Helper.init(5); 
console.log(Helper2.getData()); 

私は何をしたいが、私は技術が何ができるか

Helper2.init(Helper.number); 
console.log(Helper2.getData()); // null 
Helper.init(5); 
console.log(Helper2.getData()); // null 

で何を得る

Helper2.init(Helper.number); 
console.log(Helper2.getData()); // null 
Helper.init(5); 
console.log(Helper2.getData()); // 5 

ですそれができるならば、それは参照によって渡すことができますか?

JSBIN:https://jsbin.com/gomakubeka/1/edit?js,console

編集:人々のトンがHelper2 depend on Helperを持っているさまざまな方法を取り入れ開始する前に、Helperの実際の実装が不明であるとHelper2は、メモリアドレスを必要とするので、彼らは数を実装する方法の100年代を持つことができます。

編集2:私は、私は私が参照

で使用することができるように、このプリミティブ型をラップすることができますどのように、配列/オブジェクトは参照によって渡されるかということを知った上で、いくつかのスタートを得るために期待していたパスを想定
+0

は、あなたが持っているコードについての具体的な何ですか? 'Helper'が数値を実装できる方法が100種類あると言うと、それは' Helper'が 'Number'型のオブジェクトのルート上に常に属性を持つということです。 – zero298

+0

HelperをHelper2に直接カプセル化してみませんか? –

+0

@ zero298はい。誰かの '.randomNumber'という変数に' Helper'のelsesを実装しています @ Jean-BaptisteYunèsインタフェースが必要ですそれをAFIKで行う厳密な方法はありません)。 – CuriousDeveloper

答えて

0

まず第一にそれは動作しません:

helperは、オブジェクトを返す自己起動関数です。 initが呼び出されると、Helperオブジェクトに数値が設定されます。

次に、Helper2には、オブジェクトをnullに設定するために整数(Helper.number)をinitに渡します。したがって、あなたはHelper.numberへの参照を渡していません。それに設定された値のみ。

オブジェクト全体を渡して読み出す必要があります。

例:

var Helper = (function() { 
 
    return { 
 
     number: null, 
 
     init: function (num) { 
 
      this.number = num; //add this 
 
     } 
 
    } 
 
})(); 
 

 
var Helper2 = (function() { 
 
    return { 
 
     options: { 
 
      number: [], 
 
     }, 
 
     init: function(obj){ 
 
      
 
      this.options = obj; //save a reference to the helper obj. 
 
     }, 
 
     getData: function() { 
 
      if (this.options.number) 
 
      { 
 
       return this.options.number; 
 
      } 
 
     } 
 
    } 
 
})(); 
 

 

 
Helper2.init(Helper); //store the helper object 
 
console.log(Helper2.getData()); 
 
Helper.init(5); 
 
console.log(Helper2.getData());

+0

これは、Helper2が変数の名前を知るために、Helperが準拠しなければならない特定のインターフェイスに依存しています。例えばHelper.thisisthenumberは、私が望む番号が格納されている場所です。残念ながらインターフェースはJavaScriptのものではないので、私は2つのオブジェクトの間に契約はありません – CuriousDeveloper

+0

あなたは正しいです。それに対する解決策があります。何かを汎用的にするには、より多くのコード行が必要です。プロトタイプの継承を調べてください。 – Mouser

1

オブジェクトのみに発生する可能性がJavaScriptで参照渡し。 JavaScriptで値渡しできるのは、プリミティブなデータ型だけです。

最初のオブジェクトで、 "number:null"を2番目のオブジェクトにあるようにオプションオブジェクト内にネストするように変更した場合、そのオブジェクトの参照を別のオブジェクトに渡すことができます。トリックは、プリミティブなデータ型ではなく、オブジェクトを使用するための参照渡しが必要な場合です。代わりに、基本データ型をオブジェクト内にネストし、そのオブジェクトを使用します。

私は少しコードを変更しましたが、これはあなたが達成しようとしていたものでうまくいくと思います。

var Helper = function (num) { 
 
    return { 
 
     options: { 
 
      number: num 
 
     }, 
 
     update: function (options) { 
 
      this.options = options; 
 
     } 
 
    } 
 
}; 
 

 
var Helper2 = function (num) { 
 
    return { 
 
     options: { 
 
      number: num, 
 
     }, 
 
     update: function(options){ 
 
      this.options = options; 
 
     }, 
 
     getData: function() { 
 
      return this.options.number; 
 
     } 
 
    } 
 
}; 
 

 
var tempHelp = new Helper(); 
 
var tempHelp2 = new Helper2(); 
 
tempHelp2.update(tempHelp.options); 
 
tempHelp.options.number = 5; 
 
console.log(tempHelp2.getData());

+0

こんにちは、ようこそ。偉大な答えは、人々が結果を見ることができるようにコードスニペットであなたの答えを入れて自由を取った。 – Mouser

+0

ありがとう、ありがとう、コードスニペットに入れていただきありがとうございます。 –

0

私はあなたが正確にあなたが望む結果を得ることができるようになるだろうとは思いません。しかし、あなたのコメントの一つに、あなたが言った:

は、残念ながら、インタフェースはまさに真実ではありませんジャバスクリプト

で何かではありません。はい、強く入力する必要はありません。コードのユーザーは、関数に特定のタイプのオブジェクトが必要だと言うと、あなたの提案を完全に無視することができます。

しかし、独自のコードでniceを再生するために、ユーザーが拡張したいソートのインターフェイスを作成することはできます。たとえば、(参照することにより、プリミティブを通過することができないという問題を解決する)プリミティブをカプセル化することができますReferenceインスタンスになりますvalue計算プロパティにアクセスするためのメカニズムを提供してValuableクラスからextend、彼らがしなければならないことをユーザーに伝えることができます。

これは計算されたプロパティを使用するため、.valueという表記を利用する利点もあります。実際の値の代わりに.valueReferenceになることがあります。

// Intermediary class that can be passed around and hold primitives 
 
class Reference { 
 
    constructor(val) { 
 
    this.val = val; 
 
    } 
 
} 
 

 
// Interface that dictates "value" 
 
class Valuable { 
 
    constructor() { 
 
    this._value = new Reference(); 
 
    } 
 
    get value() { 
 
    return this._value; 
 
    } 
 
    set value(v) { 
 
    this._value.val = v; 
 
    } 
 
} 
 

 
// "Concrete" class that implements the Valuable interface 
 
class ValuableHelper extends Valuable { 
 
    constructor() { 
 
    super(); 
 
    } 
 
} 
 

 
// Class that will deal with a ValuableHelper 
 
class Helper { 
 
    constructor(n) { 
 
    this.options = { 
 
     number: n 
 
    } 
 
    } 
 
    getData() { 
 
    return this.options.number; 
 
    } 
 
    setData(n) { 
 
    this.options.number = n; 
 
    } 
 
} 
 

 
// Create our instances 
 
const vh = new ValuableHelper(), 
 
    hh = new Helper(vh.value); 
 

 
// Do our stuff 
 
console.log(hh.getData().val); 
 
vh.value = 5; 
 
console.log(hh.getData().val); 
 
hh.setData(vh.value); 
 
vh.value = 5;

+0

私はES5に限られていますが、何が可能かを見ています – CuriousDeveloper

関連する問題