2010-10-29 8 views
1

J'ai deux objets, et l'un hérite de l'autre. l'objet parent envoie une requête ajax pour envoyer un e-mail de contact.javascript inheritnace probleme

Si j'utilise l'enfant pour envoyer la demande, toutes les données sont vides ... pourquoi? la requête ajax est envoyée (à la bonne URL également) mais l'objet de données est vide.

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(); 
} 

et c'est l'objet héritant:

var conteact_B = function(){ 
    var self = this; 
    this.constructor(); 
    this.init();  
} 
conteact_B.prototype = new contact_A; 
conteact_B.prototype.url = '/yyy/yyy/yyy'; 

Répondre

0

Vous mixez le style prototype d'objet avec le par-exemple-membres-avec-ce-fermeture le style d'objet. Cela ne fonctionne pas bien.

Le problème est:

var contact_A = function(){ 
    var self = this; 
    ... do stuff with self ... 
}; 

conteact_B.prototype = new contact_A; 

maintenant la valeur de self sera toujours ce this était quand le new contact_A a été construit. C'est-à-dire: self sera toujours l'objet prototype, et jamais l'instance contact_B.

Donc, chaque fois que self est utilisé, il fonctionnera sur l'objet prototype et non sur l'instance; il ne verra aucune des propriétés de membre affectées dans le constructor.

Pour éviter toute confusion, choisissez-en un parmi des prototypes ou des objets de ce type. Voir this discussion pour un certain fond.

+0

très grand lien! Je crée maintenant une instance de contact_A dans la fonction contact_B puis change l'url. Cela fonctionne bien pour moi. – helle