我这里有个情况。
让我们来看一个例子:
function ScrewDriver(){
var data = ...;
this.driving = function(){
//Some Stuff Here
}
}
function Hammer(){
var data = ...;
this.stomp = function(){
//Some Stuff Here
}
}
function MultiTools(){
this.screwDriver = new ScrewDriver();
this.hammer = new Hammer();
}
这是我们示例的基础。
现在,我想动态地从multiTools重定向工具功能。
让我们解释一下自己:
function Work(){
this.tools = new MultiTools();
this.tools.screw(); // I want to user directly the function of the proper object
this.tools.hammer.stomp(); // Not like this;
}
我在想这样的事情:
function MultiTools(){
this.screwDriver = new ScrewDriver();
this.hammer = new Hammer();
for(var prop in this.screwDriver){
this[prop] = this.screwDriver[prop];
}
//Same for each object
}
但这并不能按照我想要的方式工作,因为如果我访问子对象函数中的子对象数据,则会收到错误消息。
当我即时调用this.tools.screw();我实际上想要this.tools.screwDriver.screw();
最后,我只想重定向。
有人知道该怎么做吗?
提前致谢。
最佳答案
您可以使用.bind()
:
this[prop] = this.screwDriver[prop].bind(this.screwDriver);
这样可以确保在调用函数时,它们将具有正确的
this
值。您可以为MultiTools对象编写一个常规函数:
function MultiTools() {
var multitool = this;
function promoteMethods(subobj) {
for (var prop in subobj)
if (typeof subobj[prop] == 'function')
multitool[prop] = subobj[prop].bind(subobj);
else
multitool[prop] = subobj[prop];
}
promoteMethods(this.hammer = new Hammer());
promoteMethods(this.screwDriver = new ScrewDriver());
// ...
}