1

我正在尝试在 Javascript 中使用原型继承。我下面的代码的问题是,当单击并MyNamespace.MyObj.myEventHandler调用按钮时, 的值this不是 的实例MyNamespace.MyObj,而是被单击的按钮。

我的结构错了吗(有没有更好的方法)?我可以以某种方式确保这this是对象的实例而不是调用者按钮吗?

var MyNamespace.MyObj = function(myform) {
  this.myform = myform;
  jQuery('.mybutton', this.myform).click(this.myEventHandler);
};

MyNamespace.MyObj.prototype = {
  myEventHandler: function() {
    this.myform.get(0).submit();
  }
};

jQuery(document).ready(function() {
  new MyNamespace.MyObj(jQuery('#myform'));
});

这只是我用来学习原型继承的一个非常愚蠢的例子。我意识到上述代码的实际功能可以简单地在 jQuery 中完成,或者我可以使用对象文字或模块模式——但我真的只是对学习原型继承感兴趣,而不是此时实现特定功能.

4

2 回答 2

5

有多种方法可以保值this,最简单的 IMO 是:

var MyNamespace.MyObj = function(myform) {
  var instance = this; // store `this`
  this.myform = myform;
  jQuery('.mybutton', this.myform).click(function () {
    instance.myEventHandler(); // use the stored value
  });
};
于 2010-07-22T15:10:17.300 回答
0

如果您有权访问* es5 Function.prototype.bind,您可以这样做:

jQuery('.mybutton', this.myform).click(this.myEventHandler.bind(this));

jQuery 提供了jQuery.proxy,它做同样的事情,但语法不同:

jQuery('.mybutton', this.myform).click(jQuery.proxy(this.myEventHandler, this));

这两者都使用方法和对象,并返回一个函数,该函数将在该对象上调用该方法。

当您在 javascript 中传递(或分配)一个方法时,它会从原始对象中分割出来。这只是你必须知道的事情之一。(实际上,这与使继承起作用的事情相同。方法从父级中分离出来,并在子级的上下文中调用。)

*说,通过es5 shim

于 2011-04-05T02:24:47.473 回答