0
A = {
   name: 'Class A',
   sayMyName: function() {
      console.log(this.name);
   }
};

B = {
   name: 'Class B', 
   sayMyName: A.sayMyName
};

B.sayMyName();  // Logs 'Class B'

我理解范围没有改变的概念,您正在将实际功能分配给另一个类。

我怎样才能得到执行和参考BsayMyNameAsayMyNamethisA

更新:解释

这样做的原因是我们有多个层:controller, bllrepository并且在某些情况下没有 BLL 逻辑要做,我们最终只是像这样传递参数:

SomeBLL = {
   readById: function(id, includes, callback) {
       SomeRepo.readById(id, includes, callback);
   }
};

如果要更改参数(更可能是创建),那么不编辑 BLL 会更容易,截至目前,它什么都不做。

我想如果它可以只将调用传递给存储库层,那将减少维护。尽管如此,控制器始终必须访问 BLL,因此如果我们确实想在以后添加逻辑,我们可以在不更改控制器的情况下将其添加到正确的位置。

我们最初的解决方案是:

SomeBLL = {
    readById: SomeRepo.readById
};

然而,上下文并没有改变,而是在我们在存储库层工作时this引用。SomeBLLSomeRepo

4

4 回答 4

1
B.sayMyName.call(A) 

应该做的工作,只是我不明白你为什么需要这种代码?如果你解释你的问题,可以有更可靠的解决方案

于 2013-08-01T19:19:22.090 回答
0

您可以在另一个匿名函数中调用它,而不是引用一个函数。

B = {
   name: 'Class B', 
   sayMyName: function () {
     A.sayMyName();
   }
};
于 2013-08-01T19:14:19.147 回答
0
SomeBLL = {
    readById: SomeRepo.readById
};

但是上下文没有改变,当我们在存储库层工作时,这指的是 SomeBLL 而不是 SomeRepo。

不需要更改其参数的通用函数将是

… = function() {
    return SomeRepo.readById.apply(SomeRepo, arguments);
}

使用arguments对象apply。但是,有一个更短的解决方案来修复thisbindFunction 方法,尽管它需要在旧浏览器中填充:

SomeBLL = {
    readById: SomeRepo.readById.bind(SomeRepo)
};
于 2013-08-02T15:36:02.243 回答
0

如果我正确理解了您的问题-您可以这样做:

A = {
   name: 'Class A',
   sayMyName: function() {
      console.log(A.name);
   }
};

现在谁来电都无所谓了sayMyName——它总是会打印的Class A

另外的选择:

A = {
   name: 'Class A',   
   sayMyName: function(obj) {
      console.log(obj.name);
   }
};

然后像这样定义 B :

B = {
   name: 'Class B', 
   sayMyName: function(){A.sayMyName(A);}
};

B.sayMyName();

或致电:B.sayMyName(A)

于 2013-08-01T18:54:07.570 回答