2017-12-18 13 views
7
변수

에 지정된 클래스 이름의 객체 생성 : 이제Node.js를 내가는 같은 클래스 계층 구조가

   |-> Square 
AbstractShape -+-> Circle 
       |-> Triangle 

을, 나는 전략 패턴을 구현하고 문자열에 저장된 클래스의 객체를 생성하고 싶습니다. PHP에서는 다음을 사용합니다 :

$type = 'Square'; 
$obj = new $type(); 

Node.js에 해당하는 항목이 있습니까?

+0

'new Square()'를 호출하는 것 – zabusa

답변

4

당신이, 당신이 할 수있는 더 강력하고 검증 가능한 방식으로 이동하고자하는 경우 클래스와 팩토리 패턴의 조합을 사용하여 객체를 발행하십시오. 다음을 확인해보십시오. 세분화 된 로직과 테스트를 포함하여이 설정을 통해 더 쉽게 얻을 수 있고 유연성을 높일 수 있습니다. 또한 .issue 콜 뒤에있는 객체를 새롭게 추상화하는 경우가 있습니다. 이는 경우에 따라 유용하고 편리 할 수 ​​있습니다.

또한 PHP 배경에 대해 언급 했으므로 ES6에서 객체 지향 접근 방식을 취하는 방법을 보여줍니다.

class AbstractShape { 
    constructor(type) { 
    this.type = type; 
    } 

    getType() { 
    console.log(`I am a ${this.type}`); 
    } 
} 

class Square extends AbstractShape { 
    constructor(type) { 
    super(type); 
    this.sides = 4; 
    } 

    getDescription() { 
    console.log(`I have ${this.sides} equal sides`); 
    } 
} 

class ShapeFactory { 
    static issue(type) { 
    switch(type) { 
     case 'Square': return new Square(type); 
     break; 
     case 'Circle': /* same pattern with a Circle class */ 
     break; 
    } 
    } 
} 

let shape = ShapeFactory.issue('Square'); 

shape.getType();  /* I am a Square */ 
shape.getDescription(); /* I have 4 equal sides */ 

JSFiddle Link - 데모


또한, 당신은 예를 들어, 중복 문자열을 다루는 것보다 좀 더 내결함성 뭔가를하려는 경우 'Square' - there are some creative ways을 사용하면 더욱 정교해질 수있는 열거 형 접근법을 활용할 수 있습니다. 여기에 부동산을 저장하고 코드 스 니펫을 다시 해시하지는 않지만 체크 아웃 할 수있는 바이올린이 포함됩니다.

JSFiddle Link - 가까이 고려하면 열거 방식 데모

2
  1. 빠르고 더러운 방법은 eval을 사용하는 것입니다. 그러나이 강하게 때문에 많은 이유로 권장하지 않습니다 - 보안, 성능, 가독성,

    function MyType() { 
    } 
    
    var typeName = 'MyType'; 
    var typeObj = eval('new ' + typeName + '()'); 
    
  2. eval이 유형의 문자열 이름의 매핑을 사용하는 것보다 훨씬 더 안전하고 올바른 (@GaloisGecko 덕분에) 지원 가능성

    function createType(name) { 
        var types = { 
        "Square": Square, 
        "Circle": Circle, 
        "Triangle": Tringle 
        }; 
        return types.hasOwnProperty(name) ? new types[name]() : null; 
    } 
    
  3. 마지막으로 공장 패턴을 적용하는 것이 가장 좋습니다. @scniro answer을 참조하십시오. 또한 당신은 안전한 방법은 팩토리 객체를 정의하는 것 here

+0

가능하면 항상 'eval'을 사용하지 마십시오. 그리고 여기서는 그렇게 할 필요가 없으므로이 솔루션에서 멀리 떨어져 있습니다. –

4

좋은 설명과 예제를 찾을 수 있습니다

function Square() { 
} 

// here other constructors for Circle and Triangle 

var factory = { 
    "Square": Square, 
    "Circle": Circle, 
    "Triangle" : Triangle 
} 

var typeName; 

// here some code which sets typeName 

var typeObj = new factory[typeName](); 
1

아주 간단한 방법 Node.js. 주변에있다 가장 단순한 방법으로 객체를 인스턴스화 할 때 실제로는 new <variableName>을 작성합니다. 여기서 variableName은 일부 모듈에서 정의되고 내보내지는 일부 기능 또는 클래스의 본문입니다. 이 함수/클래스를 변수 require()에 할당하려면.

const type = 'Square'; 
const shape = require(`${pathToShapeModules}/${type}.js`); 
const aShape = new shape(); 

사소한 단점은 require의가 상단에 배치되도록 (일부 규칙 설정에서) 그 eslint 불평이다 :

그래서, 대신

const type = 'Square'; 
const aSquare = new type(); 

당신은 쓸 필요가 기준 치수. 그리고 물론 try ... catch 등으로 적절한 예외 처리가 필요합니다. 아마도 공장 솔루션이 더 좋을 것입니다. (그래서 그것을 받아 들일 것입니다.)하지만 저는 작은 특수한 경우에이 솔루션이 괜찮다고 생각합니다.