我正在尝试在Javascript中挂钩对象的创建。对于方法来说这很容易,但是对于构造函数而言并非如此。我无法改变创建对象的方式,因为它必须适用于当前的库。
无论如何,这就是我现在所拥有的:
Function.prototype.afterConstruction = function(hookFunc) {
var oldObj = this;
var newObj = function() {
oldObj.apply(oldObj, arguments);
hookFunc.apply(oldObj, arguments);
}
newObj.prototype = oldObj.prototype; //copy prototype fields of oldObj
for (var key in oldObj) { //copy static fields of oldObj
if (oldObj.hasOwnProperty(key)) newObj[key] = oldObj[key];
}
return newObj;
};
这就是它的用法:
SomeObj = SomeObj.afterConstruction(function() {
//executed after SomeObj construction
});
问题在于,即使我复制原型,它似乎也会产生原型方法的问题。
此问题显示在以下jsfiddle中:http://www.jsfiddle.net/6rBTZ/1/
如果你用firebug运行它,它会给你一个_thisInstance.onTextChange不是一个函数,因为之前对这个对象的afterConstruction调用。
对我的施工挂钩有任何帮助或改进。
答案 0 :(得分:1)
问题是这一行:
oldObj.apply(oldObj, arguments);
在您的代码中,您实际上从未创建oldObj
的实例 - 您正在创建newObj
的实例。由于您在技术上用新构造函数替换旧构造函数,因此您需要将旧构造函数应用于替换的实例:
oldObj.apply(this, arguments);