Наследование Javascript: как

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

Я открываю элемент popin in .popin-foto . Когда я пытаюсь открыть подкласс popin в том же элементе, это не работает.

Код

это родительский

 function Popin(container, titulo, url_listagem) {
    this.url_listagem = url_listagem;
    this.titulo = titulo;
    this.overlay = $(".popin-overlay");
    this.closeButton = $(".popin-close");
    this.container = container;
}

Popin.prototype.header = function() {
    var dados = {titulo: this.titulo};
    var html = $.tmpl("header", dados);
    this.container.append(html);
};

Popin.prototype.body = function() {
    var html = $.tmpl("body");
    this.container.append(html);
};

Popin.prototype.footer = function() {
    var html = $.tmpl("footer");
    this.container.append(html);
};

Popin.prototype.close = function() {
    var self = this;

    this.container.hide(100,function(){
        self.overlay.fadeOut('fast');
    });

    $(".popin-header").remove();
    $(".popin-body").remove();
    $(".popin-footer").remove();
};

Popin.prototype.open = function(){
    var self = this;

    this.header();
    this.body();
    this.footer();

    this.closeButton.click(function(){
        self.close();
    });

    this.overlay.fadeTo("fast", 0.8, function(){
        self.container.show();
    });
};
  

подкласс

 function PopinFoto(){}

PopinFoto.prototype = new Popin($(".popin-fotos"), "fotos", "fake_url");
PopinFoto.prototype.open = function(){
    Popin.prototype.open.call(this);
    $(".enviar-foto").die().live('click', function(){
        //do something
    });
};
  

Итак, я делаю это:

 var popin = new Popin($(".popin-foto"), "title", "link");
popin.open();
popin.close();

var popinFoto = new PopinFoto($(".popin-foto"), "title", "link");
popinFoto.open(); //this not works
popin.close();
  

И в консоли ошибка не была вызвана.

Можете ли вы мне помочь?

Ответ №1:

похоже, что ваш подкласс настроен неправильно, поскольку вы устанавливаете прототип подкласса для конкретного экземпляра суперкласса.

я не совсем уверен, чего вы пытаетесь достичь, но я бы поспорил, что конструктор подкласса должен напрямую вызывать конструктор суперкласса, что-то вроде этого:

 function PopinFoto(container, titulo, url_listagem){
    Popin.call(this, container, titulo, url_listagem);
}
  

Комментарии:

1. Я пробовал это, но не сработало. Когда я это делаю, это не заданный PopinFoto, как подкласс Popin , поэтому у него нет прототипных функций parent, подобных этому. например, тело.