2017-09-28 2 views
0

이 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' 변수에있을 수 있습니다. elses 구현'Helper' @ Jean-BaptisteYunès 내가 원하는 값을 얻는 공통된 방법을 가지고 인터페이스가 필요합니다. js에서 AFIK를 수행하는 엄격한 방법은 없습니다). – CuriousDeveloper

답변

0

우선 무엇이 작동하지 않습니까?

helper은 개체를 반환하는 자체 활성화 함수입니다. init이 호출되면 Helper 개체에 번호가 설정됩니다.

Helper2에서 정수 (Helper.number)를 init에 전달하면 개체가 null로 설정됩니다. 따라서 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

이것은 Helper가 변수의 이름을 알기 위해 Helper가 준수해야하는 특정 인터페이스에 의존합니다. 예를 들어 Helper.thisisthenumber는 내가 원하는 번호를 저장하는 곳입니다. 불행히도 인터페이스는 자바 스크립트에서 무언가가 아니므로 두 객체간에 계약이 없습니다. – CuriousDeveloper

+0

맞습니다. 거기에 대한 해결책이 있습니다. 무언가를 일반화하려면 더 많은 코드 줄이 필요합니다. 프로토 타입 상속을 살펴보십시오. – Mouser

1

합격은 객체에 발생할 수 있습니다. 자바 스크립트에서 값으로 전달할 수있는 유일한 것은 원시 데이터 유형입니다.

첫 번째 객체에서 두 번째 객체에있는 것처럼 옵션 객체 내에 중첩되도록 "number : null"을 변경 한 경우 해당 객체의 참조를 다른 객체에 전달할 수 있습니다. 비법은 원시 데이터 형식이 아닌 개체를 사용하기 위해 참조로 전달해야하는 경우입니다. 대신 원시 데이터 형식을 개체 안에 중첩시키고 개체를 사용하십시오.

코드를 약간 변경했지만이 코드는 사용자가 달성하려고 시도했던 코드에서 작동한다고 생각합니다.

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

난 당신이 정확하게 당신이 원하는 것을 얻을 수있을 거라고 생각하지 않습니다.그러나, 귀하의 의견 중 하나는 말했다 :

불행하게도 인터페이스는 정확히 사실이 아니다 자바 스크립트

에 뭔가되지 않습니다. 예, 강력한 타이핑이없고 코드의 사용자는 함수에 특정 유형의 객체가 필요하다고 말하면 제안을 완전히 무시할 수 있습니다.

하지만 사용자가 자신의 코드로 멋지게 플레이하기 위해 사용자가 확장 할 수 있도록 할 수있는 정렬 인터페이스를 만들 수 있습니다. 예를 들어, Valuable 클래스의 extendvalue 계산 속성에 액세스 할 수있는 메커니즘을 제공하며 이는 프리미티브를 캡슐화 할 수있는 Reference 인스턴스가 될 것이라고 사용자에게 알릴 수 있습니다 (참조를 통해 프리미티브를 전달할 수없는 문제 해결) .

계산 된 속성을 사용하기 때문에 .value 표기법을 활용할 수도 있습니다. 문제는 .value이 실제 값 대신 Reference이된다는 것입니다.

// 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