我正在学习第二门Codeschool jQuery课程,从概念上讲,对其中一项挑战的“正确”解决方案如下:

  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课程中学到的知识,这对我来说在空间上是浪费的。由于fetchContentViaAJAX方法对于所有Wrapper实例都是通用的,因此它在逻辑上应该属于Wrapper的原型,因为通过这样的构造函数分配它,会将函数的相同副本分配给wrapper的每个实例从而浪费空间。

问题在于该方法已在构造函数中使用,因此无法在事后定义。

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

最佳答案

调用构造函数时,在运行任何代码之前,将其设置为新对象,并将构造函数的公共原型设置为新对象的内部[[prototype]]

因此,只要在调用构造函数之前将方法分配给原型,就可以从构造函数内部调用该方法,例如:

// Define the constructor
function Foo(msg) {

  // call method on instance, inherited via prototype
  this.say(msg);
}

// Add method to constructor's prototype
Foo.prototype.say = function (msg) {
  alert(msg);
};

// Call constructor with new, which will call inherited method
var foo = new Foo('blah'); // blah

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

10-09 23:40
查看更多