Dziedziczenie klas w JavaScript

Tutaj przedstawiona jest tylko implementacja dziedziczenia w JavaScript, a nie opis jak korzystac z dziedziczenia w ogóle. Jesli nie masz praktyki w wykorzystywaniu dziedziczenia klas w innych jezykach, to mozesz pominac te strone.

formatowanie, poprawki

W JavaScript dziedziczenie realizowane jest przez prototypy. Jesli chcemy utworzyc klase Pochodna dziedziczaca po klasie Bazowa, ustawiamy pole Pochodna.prototype na nowa instancje klasy Bazowa:

  function Bazowa() {
    this.metodaA = function() {
      alert("Bazowa::A()");
    }
    this.metodaB = function() {
      alert("Bazowa::B()");
    }
  }

  function Pochodna() {
    // metodaB przeciaza odpowiednia metode z klasy Bazowa:
    this.metodaB = function () {
      alert("Pochodna::B()");
    }
  }
  Pochodna.prototype = new Bazowa();

  x = new Bazowa();
  y = new Pochodna();

  x.metodaA(); // wyswietla: „Bazowa::A()”
  y.metodaA(); // wyswietla: „Bazowa::A()”
  x.metodaB(); // wyswietla: „Bazowa::B()”
  y.metodaB(); // wyswietla: „Pochodna::B()”

Istnieja inne sposoby na uzyskanie dziedziczenia w JavaScripcie. Osoby przyzwyczajone do Javy lub C++ moga zmodyfikowac prototyp obiektu Object w nastepujacy sposób:

  Object.prototype.parent = function (supClass) {
    tempObj = new supClass();
    for (property in tempObj) {
        this[property] = tempObj[property];       
    } 
  };

by pózniej w funkcjach konstruktora korzystac z metody parent(), rozwiazujacej szybko problem dziedziczenia. Oto przyklad:

  function Bazowa() {

    this.value = 5;

    this.metoda1 = function () {
        alert("Bazowa::metoda1() " + this.value);
    }

    this.metoda2 = function () {
        alert("Bazowa::metoda2()");
    }

  }

  function Pochodna() {
    this.parent(Bazowa);

    this.metoda1 = function () {
        alert("Pochodna::metoda1() " + this.value);
    }
  }

Wazne tylko, zeby this.parent() wywolywac jako pierwsza instrukcje w konstruktorze.


Zmodyfikowano: 17.03.2007, 17:44