动态地将参数添加到对象中的所有方法

时间:2013-07-17 00:42:15

标签: javascript methods arguments

方案

我有一个包含很多属性和方法的对象,并假设它存储在Global.Framework中。现在,我有另一个名为User的对象,我希望通过将Global.Framework克隆到.Framework来提供对User的访问权限。

但是,User还有一个名为Name的属性(存储在User.Name中),需要将其作为第一个参数传递给每个框架的方法,透明地。

示例代码

例如,在Global.Framework的方法声明中,可能存在类似

的内容
Global.Framework = {
    methodOne: function(name, a, b, c) { /* do something */ },
    methodTwo: function(name, a) { /* do something */ },
    propertyOne: 100,
    propertyTwo: "me"
}

但是,我希望这些方法能够像这样公开User.Framework :(属性只是克隆。它们不需要任何额外的处理)

User.Framework = {
    methodOne: function(a, b, c) {
         return Global.Framework.methodOne(User.Name, a, b, c);
    } (...)

问题

显然,由于Framework中的方法数量会发生变化,甚至可能是他们的论点,我无法在克隆过程中手动逐一声明它们。

到目前为止我尝试了什么

我已经查找了如何动态获取参数并找到了这个:How to get function parameter names/values dynamically from javascript

但我不确定如何实现这一点,最好不要使用太多的处理资源。这就是我的想法:

  1. 浏览Framework对象中的每个属性,如果不是函数则克隆它,或
  2. 获取函数的参数列表
  3. ?? 重写对return functionBeingLooped(User.Name, [the rest of the arguments])
  4. 的来电

    我坚持第3步,我有限的Javascript知识让我想起除eval之外什么都没有(这是不可能的)。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

您可以将所有User.Framework功能设置为闭包(不确定如何克隆Global.Framework)。

这是伪代码,假设用户名作为第一个参数,如果它不是你将不得不解析Global.Framework funtction .toString()值:

var org={};
org.t = function(name, a ,b){
  console.log(arguments);
};


var cloned={};
cloned.name="cloned";
// your cloning method
for(thing in org){
  if(typeof org[thing] === 'function'){
    // if name isn't the first argument then you have to use
    // org[thing].toString() and parse that
    cloned[thing]=function(){
       org[thing].apply(cloned,[cloned.name]
         .concat(Array.prototype.slice
         .call(arguments, 0)));
    }
  }
}

console.log(cloned.t("a","b"));