Javascript: расширение класса - PullRequest
1 голос
/ 21 февраля 2012

Я сейчас тестирую это и хотел бы создать класс B, который расширяет класс A, но в настоящее время у него есть проблемы:

КЛАСС A

  var CustomClassA = function(){
    console.log('Custom Class A loaded')
    this.message = ' Method Called';

  }

  CustomClassA.prototype    =   {
    constructor : CustomClassA,
    firstMethod : function(msg){
        this._output(msg);
    },
    secondMethod : function(msg){
        this._output(msg);
    },
    thirdMethod: function(msg){
        this._output(msg);
    },
    _output: function(m){
        return console.log(m + this.message);
    }   
  }

КЛАСС В:

  var CustomClassB =  CustomClassA.extend(

    function CustomClassB(){
        console.log('Custom Class B loaded')
            this.message = ' Method Called from class B';

    },{
        firstMethod : function(msg){this._output(msg);},
            secondMethod : function(msg){this._output(msg);},
        thirdMethod: function(msg){this._output(msg);},
        _output: function(m){return console.log(m + this.message);}
  });

Да, два примера облегчают, и, надеюсь, я делаю это правильно в первой инстанции. Спасибо

1 Ответ

1 голос
/ 21 февраля 2012

Ваш первый пример выглядит хорошо.

Второй пример будет работать, только если Function.prototype было присвоено свойство функции extend, в противном случае он выдаст TypeError.

Вместо этого попробуйте что-то вроде этого.

  function CustomClassB(){
      console.log('Custom Class B loaded');
      this.message = ' Method Called from class B';
  }

  CustomClassB.prototype = Object.create(CustomClassA.prototype);

  CustomClassB.prototype.firstMethod = function(msg){this._output(msg);};
  CustomClassB.prototype.secondMethod = function(msg){this._output(msg);};
  CustomClassB.prototype.thirdMethod = function(msg){this._output(msg);};
  CustomClassB.prototype._output = function(m){return console.log(m + this.message);};

Или, если вы хотите больше синтаксического сахара, вы можете создать вспомогательную функцию, чтобы скопировать прототип и объединить в него объект с синтаксисом вызова, таким как extendвы используетеЯ бы не рекомендовал прикреплять его к Function.prototype, поскольку есть большая вероятность, что он может столкнуться с каким-либо сторонним кодом.


Старые браузеры не поддерживают Object.create.Если вам требуется поддержка устаревших браузеров, вы можете написать такую ​​функцию для эмуляции:

function objectCreate(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

См. здесь , чтобы посмотреть, как это развивалось.

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