проблема наследования javascript - PullRequest
1 голос
/ 29 октября 2010

У меня есть два объекта, и один наследует от другого. родительский объект отправляет ajax-запрос на отправку контактного электронного письма.

если я использую ребенка для отправки запроса, все данные пусты ... почему это так? ajax-запрос отправляется (также по правому адресу), но объект данных пуст.

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';

1 Ответ

0 голосов
/ 29 октября 2010

Вы смешиваете стиль объекта-прототипа со стилем объекта для каждого экземпляра-члена-с-этим-замыканием. Это не работает хорошо.

Проблема:

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

conteact_B.prototype = new contact_A;

Теперь значение self всегда будет таким, какое было this при создании new contact_A. То есть: self всегда будет объектом-прототипом, а не экземпляром contact_B.

Таким образом, всякий раз, когда используется self, он будет работать с объектом-прототипом, а не с экземпляром; он не увидит ни одного из свойств элемента, назначенных в constructor.

Чтобы избежать путаницы, выберите один из прототипов или объектов этого замыкания. См. это обсуждение для некоторого фона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...