我有两个对象,一个对象继承另一个对象。 父对象发送一个 ajax 请求来发送一些联系电子邮件。
如果我使用子进程发送请求,所有数据都是空的...这是为什么? ajax 请求已发送(也发送到正确的 url),但数据对象为空。
var contact_A = function(){
var self = this;
this.url = '/xxx/xxx/xxx';
this.constructor = function(){
this.dialog = $('.contact_box');
this.sender = this.dialog.find('input[name=sender]');
this.name = this.dialog.find('input[name=name]');
this.content = this.dialog.find('textarea[name=content]');
...
}
this.init = function(){
...
this.dialog.find('.button_blue').bind('click', function(){
var data = self.process_form();
if(data != false) self.send(data);
});
...
}
this.process_form = function(){
this.validator = new validator('contact_box', true);
if(this.validator.validate(true)) {
var data = {
sender: this.sender.val(),
name: this.name.val(),
content: this.content.val()
}
return data;
} else return false;
}
this.send = function(data){
$.ajax({
type: "POST",
url: self.url,
data: data,
success: function(msg){
//if not successful
self.successful(msg);
},
async: true
});
this.close();
}
...
this.constructor();
this.init();
}
这是继承对象:
var conteact_B = function(){
var self = this;
this.constructor();
this.init();
}
conteact_B.prototype = new contact_A;
conteact_B.prototype.url = '/yyy/yyy/yyy';
最佳答案
您将对象的原型(prototype)样式与对象的每个实例成员与此闭包样式混合在一起。这效果不太好。
问题是:
var contact_A = function(){
var self = this;
... do stuff with self ...
};
conteact_B.prototype = new contact_A;
现在,self
的值将始终是构造新 contact_A
时 this
的值。也就是说:self
始终是原型(prototype)对象,而不是 contact_B
实例。
因此,每当使用 self
时,它将针对原型(prototype)对象而不是实例运行;它不会看到在构造函数
中分配的任何成员属性。
为了避免混淆,请从原型(prototype)或 this-closure 对象中选择一个。请参阅this discussion一些背景。
关于JavaScript继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4050837/