2013-01-19 2 views
0

내가 이렇게 보이는 물체가 구조적으로 동일 함에도 불구하고 다른 시나리오에서 사용됨). (someFoosomeBar이 유사하다는 사실을 무시!)자바 스크립트 DRY 개체 생성자

방법이 있나요 내가 할 수있는 추상적 인 생성자 함수, 내가, 말, _bazCon를 작성해야하는 경우, 나 자신을 반복 할 필요가 없습니다; 또는 버그가있는 경우 모든 생성자 정의를 수정하지 않아도됩니까?

나는 다음과 같이 공장 회원을 시도 :

_factory: function(type, f) { 
      if (typeof f != 'function') throw new TypeError('Bad ' + type); 
      this.fn = f; 
      } 

... 다음 :

_fooCon: function(f) { return new this._factory('Foo', f); } 

을하더라도이, 나는 작동하지 않을 것 볼 수 있습니다 노력없이! 내가 찾는 것을 달성하는 방법에 대한 아이디어가 있습니까? 그들을 구별 다른 행동이 있다면

var myObj = { 
    _factory: function(err) { 
       return function(f) { 
        if (typeof f != 'function') throw new TypeError('Bad ' + err); 
        this.fn = f; 
       }; 
      }, 
    someFoo: function(v) { 
      return new this._fooCon(function(x) { 
       return x + ' Foo ' + v; 
      }); 
      }, 

    someBar: function(v) { 
      return new this._barCon(function(x) { 
       return x + ' Bar ' + v; 
      }); 
      } 
}; 

myObj._fooCon = myObj._factory("Foo"); 
myObj._barCon = myObj._factory("Bar"); 

, 다음 _factory 생성자 내에서 호출되는 함수의 인자를받을 수 : 당신의 기능은 정말 같은 일을 할 경우

+0

'instanceof'를 사용하지 않고 대신 다형성을 사용하도록 코드를 설계하는 것이 더 나을 것입니다. 따라서 객체에 이미 해당 유형에 맞는 메소드가 포함되어 있으며 런타임 검사가 필요하지 않습니다. 예 : 객체 생성시 올바른 유형의 메소드를 사용하여 올바른 유형의 객체를 생성하십시오. – jfriend00

+0

명시 적으로 함수를 전송 한 다음 함수를 확인하면 첫 번째 예가 명확하지 않습니다. 즉, 검사는 불필요한 것처럼 보입니다 ... 그것은'// x = 3; // if (x === 3);' –

답변

2

는 다음이만큼 간단합니다 . 이 함수는 .call 또는 .apply을 사용하여 구성중인 개체에 this 값을 설정할 수 있습니다.


다른 접근 방법을 사용하면 _xxxCon 생성자를 노출 할 필요가 없도록 myObj를 만드는 생성자를 사용하고 변수 범위를 활용하는 것입니다.

다시 생성 할 필요가 없으므로 익명 함수가 생성자로 사용됩니다.

var myObj = new function() { 
    var _factory = function(err) { 
       return function(f) { 
        if (typeof f != 'function') throw new TypeError('Bad ' + err); 
        this.fn = f; 
       }; 
      }; 

    var _fooCon = _factory("Foo"); 
    var _barCon = _factory("Bar"); 

    this.someFoo = function(v) { 
      return new _fooCon(function(x) { 
       return x + ' Foo ' + v; 
      }); 
      }, 

    this.someBar = function(v) { 
      return new _barCon(function(x) { 
       return x + ' Bar ' + v; 
      }); 
      } 
}; 

당신은 반드시 외부 기능이 필요하지 않습니다

생성자로 사용되는,하지만 당신은 myObj에 객체를 반환하는 함수를 필요합니까.

당신이 다음의 _xxxCon 기능을 노출 this.-var을 변경하고 someFoosomeBar에 다시 this.을 데려 가고 싶다는 않은 경우.

+0

정말 대단합니다. 고마워요. – Xophmeister

+0

당신은 천만에요. –