Node.js - 创建变量中指定的类名对象

For*_*eti 7 javascript strategy-pattern node.js

我有一个类层次结构,如:

               |-> Square
AbstractShape -+-> Circle
               |-> Triangle
Run Code Online (Sandbox Code Playgroud)

现在,我想实现策略模式并创建一个存储在字符串中的类对象.在PHP中我会使用:

$type = 'Square';
$obj = new $type();
Run Code Online (Sandbox Code Playgroud)

Node.js中有等价物吗?

Gal*_*cko 7

一种安全的方法是定义工厂对象:

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]();
Run Code Online (Sandbox Code Playgroud)


scn*_*iro 5

如果您希望采用更强大且可测试的方法,则可以使用类和工厂模式的组合来发布对象.查看以下内容,您将看到,通过此设置,包括更精细的逻辑和测试将更容易,并为您提供更大的灵活性.你也是在.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 */
Run Code Online (Sandbox Code Playgroud)

JSFiddle Link - 演示


此外,如果你想要比处理冗余字符串更容错一些东西,例如'Square'- 有一些创造性的方法来利用类似枚举的方法,可以进一步改进这一点.我将在这里保存房地产而不是重新哈希代码片段,但会包含一个小提琴供您查看.

JSFiddle Link - 枚举方法演示