2016-08-23 6 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クラスを必要としない各データアクセスオブジェクトのための1つのように、引数のタイプに合格することが可能ですが?

require()SystemsDAOがファイル名を渡すことで動作する部分を見ることができますが、そのクラスのインスタンス化については、どうすればそれが可能かは分かりません。

+0

'新しい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

関連する問題