我有一个库,已为此定义了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...?!?!?!!