我已经在SO上阅读了类似的问题,无法弄清楚我做错了什么。我无法在构造函数方法中调用原型方法。 我得到:未捕获的TypeError:对象#没有方法' afterLoad'
var FiltersByDivision = function () {
$(document).on('afterLoad', this.afterLoad());
};
FiltersByDivision.prototype.afterLoad = function (){
console.log('afterLoad');
}
function OpenOrders() {
Widget.call(this);
FiltersByDivision.call(this);
this.widgetEndpoint = '/xxxxx';
}
OpenOrders.prototype = Object.create(Widget.prototype);
OpenOrders.prototype.constructor = OpenOrders;
答案 0 :(得分:1)
此代码存在许多问题:
您不是从FiltersByDivision继承的,因此OpenOrders
对象没有任何FiltersByDivision
方法。这就是没有afterLoad
方法的原因。
$(document).on('afterLoad', this.afterLoad());
将立即执行this.afterLoad()
并将其返回结果作为事件处理程序传递(这不是您想要的)。修复第1项后,您可能需要$(document).on('afterLoad', this.afterLoad.bind(this));
这里有许多可能的结构。如果FiltersByDivision
是一个单独的对象,那么也许OpenOrders
应该只在其实例数据中有一个这样的对象(尽管如果它正在做的就是设置一个事件处理程序,我不确定为什么它是一种单独的对象类型):
var FiltersByDivision = function () {
$(document).on('afterLoad', this.afterLoad.bind(this));
};
FiltersByDivision.prototype.afterLoad = function (){
console.log('afterLoad');
}
function OpenOrders() {
Widget.call(this);
this.filter = new FiltersByDivision();
this.widgetEndpoint = '/xxxxx';
}
OpenOrders.prototype = Object.create(Widget.prototype);
OpenOrders.prototype.constructor = OpenOrders;
答案 1 :(得分:0)
正如jsfriend已经指出的那样,AfterLoad不在ObjectOrders原型上。执行OtherConstructor.call不会继承该constuctors原型,而是初始化实例变量。
this的值是调用对象,因此函数的声明不会定义其值,而是如何调用它。你可以使用闭包:
var FiltersByDivision = function ()
var me = this;
$(document).on('afterLoad', function(){
me.afterLoad();
});
};
有关此内容的更多信息,原型和闭包可在此处找到:https://stackoverflow.com/a/16063711/1641941