如何从构造函数中调用js原型方法

How do I call a js prototype method from within the constructor function?

本文关键字:js 原型 方法 调用 构造函数      更新时间:2023-09-26

我读过关于SO的类似问题,不知道我做错了什么。我不能从构造函数方法内部调用原型方法。我得到:未捕获的类型错误:对象#没有方法"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;

此代码存在许多问题:

  1. 您不是从FiltersByDivision继承的,因此OpenOrders对象没有任何FiltersByDivision方法。这就是为什么没有afterLoad方法的原因。

  2. $(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;
正如jsfriend已经指出的那样,afterLoad不在ObjectOrders原型上。执行OtherConstructor.call不会继承该构造函数原型,而是初始化实例变量。

this的值是调用对象,因此函数的声明不定义其值,而是定义如何调用它

var FiltersByDivision = function () 
   var me = this;
   $(document).on('afterLoad', function(){
      me.afterLoad();
    });
 };

关于这个,原型和闭包的更多信息可以在这里找到:https://stackoverflow.com/a/16063711/1641941