通过创建新的构造函数来拦截构造函数

时间:2018-05-29 10:01:39

标签: javascript constructor

我有一个对象,其中每个键的值都是构造函数。

const obj = {
    a : [Function: aConstructor],
    b : [Function: bConstructor],
} 

我想创建另一个对象obj2,它将向其他服务公开,并根据提供给obj2的输入,它将使用修改的参数调用相应的obj1构造函数。 / p>

_.each(obj, (value, key) => {
    obj2[key] = function A(message) {
         if(message===null)
            message = "MY CUSTOM MESSAGE";
         value(message)
    }
});

用例:

const a = new obj2.a(null) 
//this should call the obj.a constructor with message "MY CUSTOM MESSAGE"

所以我只想拦截obj中的构造函数,并使用修改后的输入参数再次调用它。 如果问题不够明确,请告诉我?

1 个答案:

答案 0 :(得分:0)

你快到了。

我做了什么:

  • obj[key]而不是obj.value
  • 中查找所选的构造函数
  • 使用Function.prototype.call调用所选的构造函数并将this引用传递给我要创建的实例

const obj = {
    a : function (message) {
      console.log("constructor a, message : " + message);
      this.message = message;
    },
    b : function (message) {
      console.log("constructor b, message : " + message);
      this.message = message;
    },

} 


var obj2 = {};

_.each(obj, (value, key) => {
    obj2[key] = function A(message) {
         if(message===null) {
            message = "MY CUSTOM MESSAGE";
         }
         obj[key].call(this, message);
    }
});

const a = new obj2.a(null);
console.log("a = ", a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.0/underscore-min.js"></script>