Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript继承:从超类的方法设置子类的属性_Javascript_Oop_Inheritance - Fatal编程技术网

Javascript继承:从超类的方法设置子类的属性

Javascript继承:从超类的方法设置子类的属性,javascript,oop,inheritance,Javascript,Oop,Inheritance,很抱歉,如果以前有人问过我这个问题,但是经过大量的搜索,我似乎找不到一个明确解决我的情况的答案 我有一个我们称之为Form的超类,它有一些通用的方法。我将重点介绍两种特殊的方法。show_form显示表单,load_token从服务器获取令牌 类型 然后我有一个子类叫做EmailForm,它继承自表单。我还为此类定义了一个自定义提交方法,该方法由表单构造函数中的事件处理程序调用。因此,我: 电子邮件表单 最后,这里是如何将这一切结合在一起的 $('#email_form_link').bind(

很抱歉,如果以前有人问过我这个问题,但是经过大量的搜索,我似乎找不到一个明确解决我的情况的答案

我有一个我们称之为Form的超类,它有一些通用的方法。我将重点介绍两种特殊的方法。show_form显示表单,load_token从服务器获取令牌

类型 然后我有一个子类叫做EmailForm,它继承自表单。我还为此类定义了一个自定义提交方法,该方法由表单构造函数中的事件处理程序调用。因此,我:

电子邮件表单 最后,这里是如何将这一切结合在一起的

$('#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关键字定义方法,而不是使用对象的原型。当然,这意味着每个新对象将获得它自己的方法实例更多的内存,而不是继承或共享同一个实例,但这样,子类EmailForm的每个对象都将有它自己的属性令牌集

从jQuery1.7开始,.on方法是 将事件处理程序附加到文档

如果您希望每个表单都有一个令牌,那么问题可能是由异步请求在请求值时没有返回值引起的。我看不到异步代码,也看不到请求令牌值的代码

Form.prototype.load_token = function(){
  var me = this;
  $.get("ur").then(function(data){
    me.token = 'some-token';
  }//,fail function here
  );
};
如果您希望令牌设置一次,并为此后创建的每个EmailForm或表单项共享该令牌的值,请执行以下操作:

$.get("url")then(function(data){
  Form.prototype.token = data.token;
});

你确定根本的问题不是在代码检查令牌设置的结果之前异步操作没有完成吗?啊,对不起,忘了提一下。这实际上是一个同步请求。好的,你怎么知道呢。在提交函数运行之前调用show_表单?您是否知道通过console.log或其他任何.load\u令牌发生的情况?除非单击了email\u form\u链接,否则表单将不可见,此时将调用email\u form.show\u表单。因此,除非表单已被显示,否则无法提交。EmailForm的prototype属性是否仅设置为表单prototype属性的副本…因此,当您调用email\u form.show\u form时,email\u表单没有prototype属性,因此它会检查表单的prototype属性,而这就是值的来源,因此它不会更改。。。。
Form.prototype.load_token = function(){
  var me = this;
  $.get("ur").then(function(data){
    me.token = 'some-token';
  }//,fail function here
  );
};
$.get("url")then(function(data){
  Form.prototype.token = data.token;
});