Задача: ООП на javascript: классы, наследование, инкапсуляция
Исходник: Наследование, язык: javascript [code #553, hits: 9356]
автор: - [добавлен: 19.12.2007]
  1. // Базовый класс
  2. //
  3. // Create proper-derivable "class".
  4. //
  5. // Version: 1.2
  6. //
  7.  
  8. function newClass(parent, prop) {
  9. // Dynamically create class constructor.
  10. var clazz = function() {
  11. // Stupid JS need exactly one "operator new" calling for parent
  12. // constructor just after class definition.
  13. if (clazz.preparing) return delete(clazz.preparing);
  14. // Call custom constructor.
  15. if (clazz.constr) {
  16. this.constructor = clazz; // we need it!
  17. clazz.constr.apply(this, arguments);
  18. }
  19. }
  20. clazz.prototype = {}; // no prototype by default
  21. if (parent) {
  22. parent.preparing = true;
  23. clazz.prototype = new parent;
  24. clazz.prototype.constructor = parent;
  25. clazz.constr = parent; // BY DEFAULT - parent constructor
  26. }
  27. if (prop) {
  28. var cname = "constructor";
  29. for (var k in prop) {
  30. if (k != cname) clazz.prototype[k] = prop[k];
  31. }
  32. if (prop[cname] && prop[cname] != Object)
  33. clazz.constr = prop[cname];
  34. }
  35. return clazz;
  36. }
  37.  
  38. // Наследники >>
  39. // Базовый "класс".
  40. Car = newClass(null, {
  41. constructor: function() {
  42. document.writeln("Вызван конструктор Car().");
  43. },
  44. drive: function() {
  45. document.writeln("Вызван Car.drive()");
  46. }
  47. });
  48.  
  49. // Производный "класс".
  50. Zaporojets = newClass(Car, {
  51. constructor: function() {
  52. document.writeln("Вызван конструктор Zaporojets().");
  53. this.constructor.prototype.constructor.call(this);
  54. },
  55. crack: function() {
  56. document.writeln("Вызван Zaporojets.crack()");
  57. },
  58. drive: function() {
  59. document.writeln("Вызван Zaporojets.drive()");
  60. return this.constructor.prototype.drive.call(this);
  61. }
  62. });
  63.  
  64. // Пример использования >>
  65. document.writeln("Программа запущена.");
  66.  
  67. // Создаем объект производного "класса".
  68. var vehicle = new Zaporojets();
  69. vehicle.drive(); // вызывается функция базового объекта
  70.  
  71. // Создаем еще один объект того же класса.
  72. var vehicle = new Zaporojets();
  73. vehicle.crack(); // функция производного объекта
Пример использования напечатает:
Программа запущена.
Вызван конструктор Zaporojets().
Вызван конструктор Car().
Вызван Zaporojets.drive()
Вызван Car.drive()
Вызван конструктор Zaporojets().
Вызван конструктор Car().
Вызван Zaporojets.crack()

Источник: http://dklab.ru/chicken/nablas/40.html
Тестировалось на: IE 6.0 SP2, Mozilla FF 1.5, Opera 9.0

+добавить реализацию