0

设想

我有一个具有很多属性和方法的对象,并假设它存储在Global.Framework. 现在,我有另一个名为的对象User,我想Global.Framework通过克隆.Frameworkto来为其提供访问权限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 dynamic from javascript

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

  1. 遍历Framework对象中的每个属性,如果不是函数,则克隆它,或者
  2. 获取函数的参数列表
  3. ?? 将调用重写为return functionBeingLooped(User.Name, [the rest of the arguments])

我被困在第 3 步,我有限的 Javascript 知识让我除了eval(这是毫无疑问的)之外什么都没有提醒我。有没有办法做到这一点?

4

1 回答 1

1

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

这是假设用户名作为第一个参数的伪代码,如果不是,您将不得不解析 Global.Framework 函数 .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"));
于 2013-07-17T01:10:40.393 回答