从外部设置类中的Javascript变量

时间:2017-11-13 12:48:04

标签: javascript

我有一个已定义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)但是它会在全局空间中定义变量吗?

1 个答案:

答案 0 :(得分:3)

你不能合理地这样做,尤其是因为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...?!?!?!!