我这里有个情况。
让我们来看一个例子:

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());
  // ...
}

10-05 20:54
查看更多