【问题标题】:In node.js ES6, is it possible to pass in a type and then instantiate it?在 node.js ES6 中,是否可以传入一个类型然后实例化它?
【发布时间】:2016-08-23 18:50:18
【问题描述】:

在我的项目中,我有几个如下所示的类:

"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 类,而不是每个数据访问对象一个?

我可以通过传递文件名看到我 require()SystemsDAO 工作的部分,但至于该类的实例化,我真的看不出怎么可能做到这一点。

【问题讨论】:

  • 您是否试图使new SystemsDAO() 调用动态/使用不同的对象?如果是这样,是的,您可以使用 ES6 类来做到这一点(假设这就是您所说的“类型”)。只需像传递任何其他变量一样为类传递一个指针/变量,然后就可以调用new VariableName()
  • @dvlsg 正确。我希望能够将其换成其他 DAO,并通过这样做来缩减我的代码库的大小。

标签: javascript node.js ecmascript-6 es6-proxy


【解决方案1】:

当然 - 您可以像 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);
};

我不得不承认,我(个人)更愿意看到类在外部实例化并通过参数注入,而不是内联创建它。

【讨论】:

  • 只是一个观察...可能未经处理,但无论如何...sqlite3.OPEN_READONLY 也应该作为参数传入,以防万一他们需要不同的东西。
猜你喜欢
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多