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