我正在学习第二门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/