我有一个库,已为此定义了class。我想用自己的getMe()在类A之外调用me函数。

var me;
var A = function(_me){
  me = _me;
}
A.prototype.getMe = function(){
    me();
}


我在class B上这样称呼它

A.prototype.getMe.call(this),但这会引发错误,因为未定义me。如何将me传递给它?我想对getMe函数进行最小的更改。

唯一的方法是使用if。

A.prototype.getMe = function(){
  if(!me){
    me = this.myMe
  }
  me();
}


所以我做了A.prototype.getMe.call({myMe: myMe}, args),但是它会在全局空间中定义变量吗?

最佳答案

您不能合理地做到这一点,尤其是因为A基本上已损坏(请参见下文)。

是否可以完全取决于A代码的位置:如果代码在全局范围内,则可以执行所需但不应该执行的操作。如果它不在全局范围内,则只能从声明me的范围内(或其中的一个范围内)的代码中进行操作。

如果是在全局范围内,则可以这样做(但不要:-)):



// The "A" Code
var me;
var A = function(_me){
  me = _me;
}
A.prototype.getMe = function(){
  me();
}

// Your code using it
new A(); // Create `A.prototype.getMe`, because unless
         // `A` is called at least once, it doesn't exist
var myMe = function() {
  console.log("myMe called");
};
me = myMe; // Set the global `me`
A.prototype.getMe(); "myMe called"






  唯一的方法是使用if。

if(!me){
  me = this.myMe
}

  
  所以我做了A.prototype.getMe.call({myMe: myMe}, args),但是它会在全局空间中定义变量吗?


是的,会的。这就是me = this.myMe的作用。

从该观察结果看来,您可以修改A的代码。如果是这样,请对其进行修复,以使其不会根据全局变量定义原型函数。也许将代码从函数中隔离到一个不会在实例上调用的函数中,并将me作为参数传递。


  我正在一个现有的图书馆上进行一些小的更改。所以我只能在getMe函数定义中进行更改。我不能改变我的定义。


在这种情况下,您可以在末尾添加一个新的可选参数,如果提供,则使用该参数,如果不提供,则使用me

A.prototype.getMe = function(myMe){
    var meToCall = myMe || me;
    meToCall();
};


现场示例:



// The "A" Code
var me;
var A = function(_me){
  me = _me;
}
A.prototype.getMe = function(myMe){
  var meToCall = myMe || me;
  meToCall();
}

// Your code using it
A.prototype.getMe(function() {
  console.log("My me!");
});







并且,如果A确实如图所示,则基本上会损坏(除非有非常特殊的用例)。构造函数代码设置一个全局(至少对于A的代码来说是全局的),然后由原型函数使用是一个巨大的设计和维护危险信号。

考虑一下串扰恐怖:



// The "A" Code
var me;
var A = function(_me){
  me = _me;
}
A.prototype.getMe = function(){
  me();
}

// Using it
var a1 = new A(function() {
  console.log("me1");
});
a1.getMe(); // "me1" -- so far so good
var a2 = new A(function() {
  console.log("me2");
});
a2.getMe(); // "me2" -- yup, still fine
a1.getMe(); // "me2" -- what the...?!?!?!!

07-24 17:24