2016-08-23 5 views
2

В моем проекте у меня есть несколько классов, которые выглядят следующим образом:В node.js ES6, возможно ли передать его в тип, а затем создать его экземпляр?

"use strict"; 
var exports = module.exports = {}; 
var SystemsDAO = require('./dao/systems/SystemsDAO.js'); 
var aop = require('./dbAOPUtils.js'); 
var Proxy = require('harmony-proxy'); 
var sqlite3 = require('sqlite3').verbose(); 

/* Wraps a SystemServiceObject and passes in a constructed 
* DAO object as an argument to specified functions. */ 
exports.SystemsDAOIntercepter = function(obj) { 

    let handler = { 
     get(target, propKey, receiver) { 
      const origMethod = target[propKey]; 
      return function(...args) { 
      console.log('systemDAOIntercepter: BEGIN'); 

      // Create a reportsdao object and proxy it through an dbSQLiteConnectionIntercepter 
      // (So we don't have to create it for every single method) 
      var systemdao = new SystemsDAO('blah'); 
      var proxSystemDAO = aop.dbSQLiteConnectionIntercepter(systemdao, sqlite3.OPEN_READONLY); 

      args.push(proxSystemDAO); 

      console.log('propKey: ' + target[propKey]); 

      let result = null; 

      result = origMethod.apply(this, args); 

      console.log('systemsDAOIntercepter: END'); 
      return result; 
      }; 
     } 
    }; 

    return new Proxy(obj, handler); 
}; 

Можно ли пройти в типе для аргумента, так что мне нужна только один класс DAOIntercepter, а не один для каждого объекта доступа к данным ?

Я вижу часть, где я SystemsDAO работает для этого, передавая имя файла, но что касается экземпляра этого класса, я не могу понять, как это можно будет сделать.

+0

Вы пытаетесь сделать динамический вызов \ new SystemsDAO() динамическим/использовать разные объекты? Если да, да, вы можете сделать это с помощью классов ES6 (предположим, что это то, что вы подразумеваете под «типом»). Просто передайте указатель/переменную для класса, как и любую другую переменную, и вы можете называть ее «new VariableName()». – dvlsg

+0

@ dvlsg Исправить. Я хочу, чтобы иметь возможность обменивать это для других DAO и обрезать размер моей базы кода, делая это. – leeand00

ответ

2

Конечно - вы можете проходить классы, как и любую другую переменную в javascript.

Обратите внимание, что DAOType предоставляется и создается внутри метода.

"use strict"; 
var exports = module.exports = {}; 
var aop = require('./dbAOPUtils.js'); 
var Proxy = require('harmony-proxy'); 
var sqlite3 = require('sqlite3').verbose(); 

/* Wraps a SystemServiceObject and passes in a constructed 
* DAO object as an argument to specified functions. */ 
exports.makeInterceptor = function(DAOType, obj) { 

    let handler = { 
     get(target, propKey, receiver) { 
      const origMethod = target[propKey]; 
      return function(...args) { 
      console.log('systemDAOIntercepter: BEGIN'); 

      // Create a reportsdao object and proxy it through an dbSQLiteConnectionIntercepter 
      // (So we don't have to create it for every single method) 
      var dao = new DAOType('blah'); 
      var proxSystemDAO = aop.dbSQLiteConnectionIntercepter(dao, sqlite3.OPEN_READONLY); 

      args.push(proxSystemDAO); 

      console.log('propKey: ' + target[propKey]); 

      let result = null; 

      result = origMethod.apply(this, args); 

      console.log('makeInterceptor: END'); 
      return result; 
      }; 
     } 
    }; 

    return new Proxy(obj, handler); 
}; 

Я должен признать, что я (лично) предпочитают видеть класс экземпляр внешне и впрыскивается через аргументы, однако, вместо того, чтобы создавать его рядный.

+0

Просто наблюдение ... возможно, не обработано, но в любом случае ... 'sqlite3.OPEN_READONLY' также должен быть передан как аргумент, на случай, если им потребуется что-то другое. – leeand00