如何覆盖 javascript 中的 "private" 函数
How to override "private" function in javascript
我将用一个例子来解释我正在解决的问题。
我通常这样在js中定义自己的库:
window.myLib = (function () {
var public = {}; // for storing public methods and values
var private = {}; // for storing private methods and values
// Atributes and methods here
return public; // return the public part to be used globally
})();
现在我想执行一个可覆盖的方法作为单击事件的回调。我会这样做:
<input type="checkbox" id="mCheck" onchange="myLib.myMethod()">
然后,在库中我声明回调 "myMethod" 调用另一个我想全局使用的 public "overridable" 方法,"outside of the library":
//...
public.overridable = function(param){console.log("Override this!");};
public.myMethod = function(){
if(private.condition) // Just to put some logic
public.overridable(private.value);
};
//...
问题来了。如果我像这样重新定义 "overridable" 方法:
myLib.overridable = function(p){console.log(p)};
然后单击事件的回调继续触发原始 "public.override",它输出 "Override this!" 消息而不是参数值。
如何重写public方法在库外重新定义回调?
提前致谢。
您提供的片段已经是执行此操作的正确方法。如果您遇到问题,那是因为您的实现中的一些细节 - 例如,如果您将 public.overridable
存储在某个变量中并以这种方式调用它,而不是每次都引用 public.overridable
。
我已将您的代码片段放在下面的一个工作示例中,以表明它完全符合预期。
window.myLib = (function () {
var public = {}; // for storing public methods and values
var private = {}; // for storing private methods and values
// Atributes and methods here
public.overridable = function(param){console.log("Override this!");};
public.myMethod = function(){
if(private.condition) // Just to put some logic
public.overridable(private.value);
};
private.condition = true;
private.value = "test";
return public; // return the public part to be used globally
})();
myLib.overridable = function(p){console.log(p)};
<input type="checkbox" id="mCheck" onchange="myLib.myMethod()">
您始终可以永久修改 public 实现,但我假设您需要的是临时覆盖。如果是这样,我认为您最好的选择是重新设计图书馆。如果你需要能够动态地改变行为,你需要你的 API 来支持它。
public.myMethod = function (impl = public.overridable) {
if(private.condition)
impl(private.value)
}
// ...
myLib.myMethod () // uses default behavior
// ...
myLib.myMethod (overridingFunction) // overrides that behavior.
我将用一个例子来解释我正在解决的问题。
我通常这样在js中定义自己的库:
window.myLib = (function () {
var public = {}; // for storing public methods and values
var private = {}; // for storing private methods and values
// Atributes and methods here
return public; // return the public part to be used globally
})();
现在我想执行一个可覆盖的方法作为单击事件的回调。我会这样做:
<input type="checkbox" id="mCheck" onchange="myLib.myMethod()">
然后,在库中我声明回调 "myMethod" 调用另一个我想全局使用的 public "overridable" 方法,"outside of the library":
//...
public.overridable = function(param){console.log("Override this!");};
public.myMethod = function(){
if(private.condition) // Just to put some logic
public.overridable(private.value);
};
//...
问题来了。如果我像这样重新定义 "overridable" 方法:
myLib.overridable = function(p){console.log(p)};
然后单击事件的回调继续触发原始 "public.override",它输出 "Override this!" 消息而不是参数值。
如何重写public方法在库外重新定义回调?
提前致谢。
您提供的片段已经是执行此操作的正确方法。如果您遇到问题,那是因为您的实现中的一些细节 - 例如,如果您将 public.overridable
存储在某个变量中并以这种方式调用它,而不是每次都引用 public.overridable
。
我已将您的代码片段放在下面的一个工作示例中,以表明它完全符合预期。
window.myLib = (function () {
var public = {}; // for storing public methods and values
var private = {}; // for storing private methods and values
// Atributes and methods here
public.overridable = function(param){console.log("Override this!");};
public.myMethod = function(){
if(private.condition) // Just to put some logic
public.overridable(private.value);
};
private.condition = true;
private.value = "test";
return public; // return the public part to be used globally
})();
myLib.overridable = function(p){console.log(p)};
<input type="checkbox" id="mCheck" onchange="myLib.myMethod()">
您始终可以永久修改 public 实现,但我假设您需要的是临时覆盖。如果是这样,我认为您最好的选择是重新设计图书馆。如果你需要能够动态地改变行为,你需要你的 API 来支持它。
public.myMethod = function (impl = public.overridable) {
if(private.condition)
impl(private.value)
}
// ...
myLib.myMethod () // uses default behavior
// ...
myLib.myMethod (overridingFunction) // overrides that behavior.