Advertisement
Guest User

Untitled

a guest
Jul 28th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Пример прототипного наследования в JS</title>
  6. </head>
  7.  
  8.  
  9. <body>
  10.  
  11. <script>
  12.  
  13. (function() {
  14. var Animal, Horse, Snake, sam, tom, // Объявляем переменные
  15.  
  16. // Расширяем дочерний элемент родительским
  17. extend = function(child, parent) {
  18. // Копируем все свои свойства и методы из родителя в дочерний объект
  19. for (var key in parent) {
  20. child[key] = parent[key];
  21. }
  22.  
  23. // На временный конструктор функции extend вешаем дочерний объект
  24. function ctor() {
  25. this.constructor = child;
  26. }
  27.  
  28. // На временный конструктор ctor в прототип вешаем прототип родителя
  29. ctor.prototype = parent.prototype;
  30.  
  31. //
  32. child.prototype = new ctor();
  33.  
  34. //
  35. child.__super__ = parent.prototype;
  36. return child;
  37. },
  38.  
  39. // Перебор только собственных свойств объекта
  40. hasProp = {}.hasOwnProperty;
  41.  
  42.  
  43.  
  44. // Animal, родительский класс всех животных
  45. Animal = (function() {
  46. // Сам конструктор
  47. function Animal(name, age) {
  48. this.name = name;
  49. this.age = age;
  50. }
  51.  
  52. // Все живтоные могут двигаться; функция на прототипе,
  53. // чтобы все дочерние классы могли к ней обращаться без
  54. // необходимости копирования внутрь себя (экономно)
  55. Animal.prototype.move = function(meters) {
  56. return console.log(this.name + (" moved " + meters + "m."));
  57. };
  58.  
  59. // Возвращаем Animal
  60. return Animal;
  61. })();
  62.  
  63.  
  64.  
  65. // Класс Snake, наследник Animal
  66. Snake = (function(superClass) {
  67. // Расширяем дочерний класс родительским
  68. extend(Snake, superClass);
  69.  
  70. // Сама функция Snake
  71. function Snake() {
  72. // вызывает конструктор роительского класса, но this
  73. // отдает свой собственный; __super__ уже есть в дочернем
  74. // оклассе - его туда повесила выполненная выше функция extend
  75. return Snake.__super__.constructor.apply(this, arguments);
  76. }
  77.  
  78. // На прототип дочернего элемента вешаем ф-ю move
  79. Snake.prototype.move = function() {
  80. // Здесь будет два вывода в консоль:
  81. // первый - метод дочернего класса
  82. console.log("Slithering...");
  83. // второй - вызов метода родителя, но с this'ом дочки
  84. return Snake.__super__.move.call(this, 5);
  85. };
  86.  
  87. // Возвращаем в переменную наш созданный дочерний объект
  88. return Snake;
  89. })(Animal);
  90.  
  91.  
  92.  
  93. // Класс Horse, наследник Animal, по аналогии со Snake
  94. Horse = (function(superClass) {
  95. extend(Horse, superClass);
  96.  
  97. function Horse() {
  98. return Horse.__super__.constructor.apply(this, arguments);
  99. }
  100.  
  101. Horse.prototype.move = function() {
  102. console.log("Galloping...");
  103. return Horse.__super__.move.call(this, 45);
  104. };
  105.  
  106. return Horse;
  107. })(Animal);
  108.  
  109. // Создаем животных
  110. sam = new Snake("Sammy the Python");
  111. tom = new Horse("Tommy the Palomino");
  112.  
  113. // Животные двигаются
  114. sam.move();
  115. tom.move();
  116.  
  117. }).call(this);
  118. // Все обернуто в анонимную самовызывающуюся функцию и передан this == window,
  119. // чтобы не допустить пакостного создания глобальных переменных
  120.  
  121. </script>
  122.  
  123. </body>
  124. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement