Как динамически генерировать класс из описательного объекта? - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь выполнить функцию, которая получает объект в качестве параметра и возвращает класс (или конструктор), сгенерированный на основе полученного описательного объекта. Есть ли резольвента без использования «eval»?

// this is the function to create class.
function createClass (option) {
    // TODO how to generate...
    // return classGenerated
}

// then, i can do this to create a 'Node' class.
createClass({
    name: "Node",
    data: {
        x: 0,
        y: 0
    },
    methods: {
        translate (dx, dy) {
            this.x += dx;
            this.y += dy;
        }
    }
})

// then i can create a instance by doing this below.
const node = new Node();

Я выполнил одну версию с помощью функции 'eval'. Я хочу знать, есть ли другие лучшие способы сделать это. Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вы можете воспользоваться преимуществами Javascript clojures, но у вас должно быть немного другое поведение: вы не можете определить класс глобально (AFAIK), но вы можете вернуть его.

Итак, использование станет:

const Node = createClass(...)
const node = new Node();

Чтобы получить этот результат, метод createClass должен вернуть новое определение класса:

function createClass(options) {
  return class {
    constructor() {
      Object.assign(this, options.data, options.methods)
    }
  }
}

Теперь вы можете сделать что-то вроде:

const node = new Node();

node.translate(10, 15)
console.log(node.x)    // 10

node.translate(13, 15)
console.log(node.x)    // 23

Кстати, в ES6 метод createClass может стать действительно замечательным, на мой взгляд:)

const createClass = ({ data, methods }) =>
  class {
    constructor() {
      Object.assign(this, data, methods)
    }
  }
0 голосов
/ 13 января 2019

Вместо автономных динамических имен переменных рассмотрите возможность использования объекта классов, проиндексированного именами классов (например, Node), чтобы вы могли сделать что-то вроде const node = new createdClasses.Node():

const createdClasses = {};
function createClass ({ name, data, methods }) {
  class theClass {
    constructor() {
      Object.assign(this, data);
    }
  }
  Object.assign(theClass.prototype, methods);
  createdClasses[name] = theClass;
}
createClass({
  name: "Node",
  data: {
      x: 0,
      y: 0
  },
  methods: {
      translate (dx, dy) {
          this.x += dx;
          this.y += dy;
      }
  }
})

const node = new createdClasses.Node();
node.translate(5, 5);
console.log(node.x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...