如果以前有人问过这个问题,我很抱歉,但经过大量搜索,我似乎找不到一个明确解决我的问题的答案。
我有一个我们称之为Form的超级类,它有一些通用方法。我只关注两种特殊的方法。show_form()
显示表单,load_token()
从服务器获取令牌。
表单
function Form() {
// Event handler for form submission
this.submit_button.bind('click', jQuery.proxy(function(){
this.submit();
}, this));
}
Form.prototype.show_form = function() {
// Some other stuff happens here, but this is the relevant part.
// We load the token
this.load_token();
}
Form.prototype.load_token = function(){
// Contains a synchronous ajax request that fetches the token from the server
// and sets it. So we end up with
this.token = 'some-token';
};
然后我有一个名为EmailForm的子类,它继承了Form。我还为这个类定义了一个自定义的submit()
方法,该方法由Form()
的构造函数中的事件处理程序调用。所以我有:
电子邮件窗体
function EmailForm() {};
EmailForm.prototype = new Form();
EmailForm.prototype.submit = function() {
console.log(this.token); // Returns undefined
};
最后,以下是如何将其整合在一起
$('#email_form_link').bind('click', function(){
var email_form = new EmailForm();
email_form.show_form();
});
问题
所以我需要令牌来向服务器发出请求。由于有几个表单需要load_token()
方法,我在超类中定义了它,并让子类继承它。由于我调用了email_form.show_form()
,我希望email_form
的token
属性会被设置,但事实并非如此。
那么,我如何调用从超类继承的方法,并让它更改调用它的子类的属性呢?
您可以尝试使用this
关键字而不是使用对象的prototype
来定义方法。当然,这意味着每个新对象都将获得自己的方法实例(更多内存),而不是"继承"或共享同一实例,但通过这种方式,每个对象(子类EmailForm)都将设置自己的属性token
。
Ex。
http://jsfiddle.net/64RRY/1/
http://api.jquery.com/bind/
从jQuery 1.7开始,.on()方法是将事件处理程序附加到文档。
如果你想要每个表单都有一个令牌,那么问题可能是由异步请求在请求值时没有返回值引起的(我没有看到异步代码,也没有看到请求令牌值的代码)
Form.prototype.load_token = function(){
var me = this;
$.get("ur").then(function(data){
me.token = 'some-token';
}//,fail function here
);
};
如果您希望令牌设置一次,并为之后创建的每个EmailForm或Form项目共享其值:
$.get("url")then(function(data){
Form.prototype.token = data.token;
});