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

时间:2015-03-30 15:24:04

标签: javascript prototype

我已经在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;

2 个答案:

答案 0 :(得分:1)

此代码存在许多问题:

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

  2. $(document).on('afterLoad', this.afterLoad());将立即执行this.afterLoad()并将其返回结果作为事件处理程序传递(这不是您想要的)。修复第1项后,您可能需要$(document).on('afterLoad', this.afterLoad.bind(this));

  3. 这里有许多可能的结构。如果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