Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Пример прототипного наследования в JS</title>
- </head>
- <body>
- <script>
- (function() {
- var Animal, Horse, Snake, sam, tom, // Объявляем переменные
- // Расширяем дочерний элемент родительским
- extend = function(child, parent) {
- // Копируем все свои свойства и методы из родителя в дочерний объект
- for (var key in parent) {
- child[key] = parent[key];
- }
- // На временный конструктор функции extend вешаем дочерний объект
- function ctor() {
- this.constructor = child;
- }
- // На временный конструктор ctor в прототип вешаем прототип родителя
- ctor.prototype = parent.prototype;
- //
- child.prototype = new ctor();
- //
- child.__super__ = parent.prototype;
- return child;
- },
- // Перебор только собственных свойств объекта
- hasProp = {}.hasOwnProperty;
- // Animal, родительский класс всех животных
- Animal = (function() {
- // Сам конструктор
- function Animal(name, age) {
- this.name = name;
- this.age = age;
- }
- // Все живтоные могут двигаться; функция на прототипе,
- // чтобы все дочерние классы могли к ней обращаться без
- // необходимости копирования внутрь себя (экономно)
- Animal.prototype.move = function(meters) {
- return console.log(this.name + (" moved " + meters + "m."));
- };
- // Возвращаем Animal
- return Animal;
- })();
- // Класс Snake, наследник Animal
- Snake = (function(superClass) {
- // Расширяем дочерний класс родительским
- extend(Snake, superClass);
- // Сама функция Snake
- function Snake() {
- // вызывает конструктор роительского класса, но this
- // отдает свой собственный; __super__ уже есть в дочернем
- // оклассе - его туда повесила выполненная выше функция extend
- return Snake.__super__.constructor.apply(this, arguments);
- }
- // На прототип дочернего элемента вешаем ф-ю move
- Snake.prototype.move = function() {
- // Здесь будет два вывода в консоль:
- // первый - метод дочернего класса
- console.log("Slithering...");
- // второй - вызов метода родителя, но с this'ом дочки
- return Snake.__super__.move.call(this, 5);
- };
- // Возвращаем в переменную наш созданный дочерний объект
- return Snake;
- })(Animal);
- // Класс Horse, наследник Animal, по аналогии со Snake
- Horse = (function(superClass) {
- extend(Horse, superClass);
- function Horse() {
- return Horse.__super__.constructor.apply(this, arguments);
- }
- Horse.prototype.move = function() {
- console.log("Galloping...");
- return Horse.__super__.move.call(this, 45);
- };
- return Horse;
- })(Animal);
- // Создаем животных
- sam = new Snake("Sammy the Python");
- tom = new Horse("Tommy the Palomino");
- // Животные двигаются
- sam.move();
- tom.move();
- }).call(this);
- // Все обернуто в анонимную самовызывающуюся функцию и передан this == window,
- // чтобы не допустить пакостного создания глобальных переменных
- </script>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement