方案
我有一个包含很多属性和方法的对象,并假设它存储在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
但我不确定如何实现这一点,最好不要使用太多的处理资源。这就是我的想法:
Framework
对象中的每个属性,如果不是函数则克隆它,或return functionBeingLooped(User.Name, [the rest of the arguments])
我坚持第3步,我有限的Javascript知识让我想起除eval
之外什么都没有(这是不可能的)。有没有办法实现这个目标?
答案 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"));