Javascript 如何从构造函数中调用js原型方法?
我读过类似的问题,但不知道我做错了什么。我无法从构造函数方法中调用原型方法。 我得到:uncaughttypeerror:Object#没有“afterLoad”方法Javascript 如何从构造函数中调用js原型方法?,javascript,prototype,Javascript,Prototype,我读过类似的问题,但不知道我做错了什么。我无法从构造函数方法中调用原型方法。 我得到:uncaughttypeerror:Object#没有“afterLoad”方法 var FiltersByDivision = function () { $(document).on('afterLoad', this.afterLoad()); }; FiltersByDivision.prototype.afterLoad = function (){ console.log('after
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;
正如jsfriend已经指出的,后加载不在ObjectOrders原型上。执行OtherConstructor.call不会继承该构造函数原型,而是初始化实例变量 它的值是调用对象,因此函数的声明不定义它的值,而是定义如何调用它。您可以使用闭包:
var FiltersByDivision = function ()
var me = this;
$(document).on('afterLoad', function(){
me.afterLoad();
});
};
有关这方面的更多信息、原型和闭包可以在此处找到:此代码存在许多问题:
OpenOrders
对象没有任何FiltersByDivision
方法。这就是为什么没有afterLoad
方法的原因$(document.on('afterLoad',this.afterLoad())
将立即执行this.afterLoad(),并将其返回结果作为事件处理程序传递(这不是您想要的)。在修复项目1之后,可能需要$(document).on('afterLoad',this.afterLoad.bind(this))代码>
FiltersByDivision
是一个单独的对象,那么可能OpenOrders
的实例数据中应该只有一个这样的对象(尽管如果它所做的只是设置一个事件处理程序,我不确定为什么它是一个单独类型的对象):
您是否正在使用
new
创建新的OpenOrders
对象<代码>var x=新OpenOrders()代码>?还有,为什么要调用不是从中继承的FiltersByDivision
?是的,使用var x=new OpenOrders()中的new as;从过滤器按除法继承的任何代码在哪里?您的OpenOrders
对象将不会有任何来自FiltersByDivision
原型的方法,因为您从未做过任何事情来继承该对象或将这些方法添加到您的对象中。另外请注意,您当前正在将afterload
事件绑定到调用this.afterload()
(当前未定义
),而不是函数本身。仍然无法正常工作未捕获类型错误:Object#没有方法“afterLoad”你知道任何解释#1的地方吗?我在寻找原型继承的好解释时出人意料地不走运。@NeilKempin-我们需要更多地了解你真正想做的事情,因为有几种不同的方法可以解释#1oaches取决于对象和继承的特定需要和结构/组织。请参见我在回答中添加的一个想法。@NeilKempin您可以尝试我回答中的链接。如果有任何不清楚的地方,您可以对该问题进行评论
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;