- 主题:JavaScript 函数指针适配器的问题 (转载)
【 以下文字转载自 WebDev 讨论区 】
发信人: RBAC (ke), 信区: WebDev
标 题: JavaScript 函数指针适配器的问题
发信站: 水木社区 (Wed Oct 21 12:09:35 2009), 站内
现在有个第三方类库,某个函数接收一个函数指针作为参数。我改动不了这个类库的代码。
示意性的代码是
function util( fPtr )
Clazz.util = util;
用户使用这个类库,我也不能直接改动用户的代码。
function f(){}
clazzObj.util( f );
现在想写段代码把用户的代码拦截下来,
originalUtil = Clazz.prototype.util;
Clazz.prototype.util = something{
// do XXX
originalUtil.apply(this, arguments);
}
这个something的地方应该怎么写呢?
--
FROM 211.99.222.*
【 在 RBAC (ke) 的大作中提到: 】
: 【 以下文字转载自 WebDev 讨论区 】
: 发信人: RBAC (ke), 信区: WebDev
: 标 题: JavaScript 函数指针适配器的问题
: 发信站: 水木社区 (Wed Oct 21 12:09:35 2009), 站内
: 现在有个第三方类库,某个函数接收一个函数指针作为参数。我改动不了这个类库的代码。
: 示意性的代码是
: function util( fPtr )
: Clazz.util = util;
: 用户使用这个类库,我也不能直接改动用户的代码。
: function f(){}
: clazzObj.util( f );
: 现在想写段代码把用户的代码拦截下来,
: originalUtil = Clazz.prototype.util;
: Clazz.prototype.util = something{
Clazz.prototype.util = function (fPtr) {
// ...
};
js 里面函数就是个很普通的对象罢了
可以传递,可以没有名字,可以赋给任何一个或多个变量
实际上我推荐所有函数定义都写成 var f = function () { }
: // do XXX
: originalUtil.apply(this, arguments);
: }
: 这个something的地方应该怎么写呢?
--
修改:withinsea FROM 125.33.193.76
FROM 125.33.193.76
多谢指点,我这个问题描述得不好。
现在假设Clazz有个write-only的property,例如我们叫他Clazz.callbackPtr。
我现在要重写这个callbackPtr的Setter函数(我现在只考虑FF3)。
var originalSetter = Clazz.prototype.__lookupSetter__("callbackPtr" );
Clazz.prototype.__defineSetter__("callbackPtr", function(){
originalSetter.apply(this, argument)
});
以上实现相当于什么都没做。我想把这个指针总设成自己的一个adaptor,例如:
Clazz.prototype.__defineSetter__("callbackPtr", function(){
originalSetter.apply(this, myAdaptor(this, argument) );
});
这个myAdaptor应该怎么写呢?一方面,他像一个函数调用,有传入的值。另外一方面,他应该返回一个函数指针。
【 在 withinsea (沐海~魔導奏器|歌の琴フォルテール) 的大作中提到: 】
: Clazz.prototype.util = function (fPtr) {
: // ...
: };
: ...................
--
修改:RBAC FROM 211.99.222.*
FROM 211.99.222.*
搞定了,在Clazz里面添加一个自己的property记录用户传入的指针,再自己写个适配器
就OK了
【 在 RBAC (ke) 的大作中提到: 】
: 多谢指点,我这个问题描述得不好。
: 现在假设Clazz有个write-only的property,例如我们叫他Clazz.callbackPtr。
: 我现在要重写这个callbackPtr的Setter函数(我现在只考虑FF3)。
: ...................
--
FROM 211.99.222.*