2012-06-12 2 views
1

Я играю с наследованием класса Mootools и т. Д., И я пытаюсь вызвать переопределенные методы базовых классов с помощью свойства .parent (sry для длинного фрагмента кода).Класс Mootools расширяет вызывающий переопределенный родительский метод

var app = this.app = {}, 
    //ultimate base class 
    Animal = new Class({ 
     initialize : function(param){ 
      this.age = param.age; 
      this.name = param.name; 
     }, 
     doStuff : function(param){ 
      alert("animal doStuff"); 
     } 
    }), 
    //herbivore functionality 
    HerbivoreBehaviour = new Class({ 
     eat : function(){ 
      alert('Plants are scrumptious'); 
     } 
    }), 
    //carnivore functionality 
    CarnivoreBehaviour = new Class({ 
     eat : function(){ 
      alert('Meat tastes gooood'); 
     } 
    }) 
    //mammal base class 
    Mammal = new Class({ 
     Extends : Animal, 
     initialize : function(param){ 
      this.parent(param); 
      this.numberOfNipples = param.numberOfNipples; 
     }, 
     doStuff : function(){ 
      alert("mammal doStuff"); 
      this.doStuff.parent(); 
     } 
    }), 
    //reptile base class 
    Reptile = new Class({ 
     Extends : Animal, 
     initialize : function(param){ 
      this.parent(param); 
      this.numberOfScales = param.numberOfScales; 
     }, 
     doStuff : function(){ 
      alert('reptile doStuff'); 
      this.doStuff.parent(); 
     } 
    }), 
    //final top class animal->mammal-cow! 
    //and it's a herbivore 
    Cow = new Class({ 
     Extends : Mammal, 
     Implements : HerbivoreBehaviour, 
     initialize : function(param){ 
      this.parent(param); 
      this.isMooCrazy = param.isMooCrazy; 
     }, 
     doStuff : function(){ 
      alert('I am a cow'); 
      this.doStuff.parent(); 
     } 
    }), 
    //final top level class animal->reptile->mutantLizard! 
    //and it's a carnivore 
    MutantLizard = new Class({ 
     Extends : Reptile, 
     Implements : CarnivoreBehaviour, 
     initialize : function(param){ 
      this.parent(param); 
      this.isDestroyingEverything = param.isDestroyingEverything; 
     }, 
     doStuff : function(){ 
      alert('STOMP STOMP STOMP CRRRRRASH'); 
      this.doStuff.parent(); 
     } 
    }); 

    app.run = function(){ 
     var daisy = new Cow({ 
       name : 'Daisy', 
       age : 2, 
       numberOfNipples : 6, 
       isMooCrazy : true 
      }), 
      godzilla = new MutantLizard({ 
       name : 'Godzilla', 
       age : 1123, 
       numberOfScales : 123456, 
       isDestroyingEverthing : true 
      }); 

     daisy.eat(); 
     godzilla.eat(); 
     daisy.doStuff(); 
     godzilla.doStuff(); 
    }; 

токовый выход правильно с daisy.eat() и godzilla.eat(), но затем выполнение останавливается после первого оператора печати от daisy.doStuff() не затем вызвать маргаритки родительского класса DoStuff () метод, на который я надеялся. Не могли бы вы рассказать мне, как я бы назвал doStuff?

UPDATE:

мне удалось зафиксировать его называют последовательность по replacnig this.doStuff.parent() с this.parent(). Однако это поставило вопрос о том, что «это» повторяет. Я думал, что это будет фактический экземпляр класса ie. daisy или godzilla, но использование this.parent() в методе doStuff, по-видимому, подразумевает, по крайней мере, для меня, что «это» относится к фактическому объекту Function, в котором он находится внутри, за исключением вызова метода parent() внутри функции автоматически ищет способ, в котором вы находитесь, и вызывает его первый переопределенный метод.

+0

это относится к экземпляру - объекту, являющемуся объектом хоста используемого вами метода. –

ответ

2

Право. ну в принципе, все хорошо, это хорошие новости. единственное изменение, которое требуется, - это замена вашего this.doStuff.parent() на this.parent().

http://jsfiddle.net/dimitar/njQBN/

, кажется, работает хорошо.

this.doStuff.parent() не очень DRY для начала, а также ссылается на локальное свойство, которое в контексте класса, которое расширяет и реализует другие с помощью того же метода, в то же время будет иметь ... неожиданный Результаты.

+0

Я просто подумал, что метод doStuff будет иметь свойство «parent», с помощью которого можно вызвать переопределенный метод, потому что в Docs говорится: «Методы этого класса, имеющие то же имя, что и Extends Class, будут иметь родительское свойство, что позволяет вам вызвать другой переопределенный метод ». поэтому почему я пытался сделать doStuff.parent(), но я предпочитаю реальный способ, он выглядит и чувствует себя лучше. – 0xor1

Смежные вопросы