javascript - 将构造函数中使用的函数移至该构造函数的原型(prototype)

标签 javascript jquery

我正在参加 Codeschool jQuery 的第二门类(class),其中一个挑战的“正确”解决方案在概念上看起来如下:

  function Wrapper(jQobject) {
    this.target=jQobject;

    this.fetchContentViaAJAX = function() {
    //fairly long function definition
    //...
    }

    this.target.on('click', '.child', this.fetchContentViaAJAX);
  }

Wrapper 对象基本上是为了包装 jQuery 对象,例如 $('#some_id') 添加 fetchContentViaAJAX 方法,并且在包装对象上注册一个 jQuery 回调,以便当该对象内部发生预先指定的事件时(这里是包装对象内部“.child”上的“单击”),fetchContentViaAJAX() 方法获取调用,它修改包装的对象。

现在,根据我在他们的 JavaScript 类(class)中学到的知识,这对我来说似乎浪费了空间。由于 fetchContentViaAJAX 方法对于所有 Wrapper 实例都是通用的,因此它在逻辑上应该属于 Wrapper 的原型(prototype),因为通过构造函数分配它,例如这会将函数的相同副本分配给包装器的每个实例,从而浪费空间。

问题是构造函数中已经需要该方法,因此无法事后定义。

是否有一个优雅的解决方案(除了将其设为 fetchContentViaAJAX 为全局函数而不是实例方法之外)?

最佳答案

您可以在构造函数中引用原型(prototype)上定义的函数:

function Thing() {
  this.init();
}

Thing.prototype.init = function() {
  console.log("I'm defined on the prototype");
};

new Thing();

因此,您可以将该函数提取到原型(prototype)中。

唯一需要注意的是该函数是否是一个闭包:如果 fetchContentViaAjax 函数需要引用 Wrapper 函数的本地范围内的某些变量。

function Thing2() {
  var localState = "some local value";

  this.init = function() {
    // do something with localState
  };

  document.body.addEventListener('click', this.init);
}

关于javascript - 将构造函数中使用的函数移至该构造函数的原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737336/

相关文章:

jquery - 使用 Spring 和 Ajax 从 Post 方法接收 Rest Controller 中的参数

javascript - 使下拉div与内容div重叠

javascript - 如何更改json数组所有节点的值

javascript - 通过在多选参数中附加/更新字符串来传递参数值

javascript - 通过 Selenium WebDriver 从 JavascriptExecutor 接口(interface)使用 executeScript 方法时,arguments[0] 和 arguments[1] 是什么意思?

javascript - Wijmo 饼图对象引用错误?

javascript - Bootstrap ui Modal 的垂直和水平居中

JavaScript基于域名的重定向

javascript - 在类型上输入自动对焦

javascript - 如何检查ajax请求是否被浏览器中止