Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прототипное наследование (https://javascript.ru/forum/misc/31582-prototipnoe-nasledovanie.html)

bFree 13.09.2012 12:02

Прототипное наследование
 
Здравствуйте!
Понадобилось реализовать наследование на прототипах (до этого обходился без него), прочитал учебник, но, честно говоря, запутался.

Опишу, что я пытался сделать:

// Базовый класс
        function Animal() {
            this.init();
        }

        Animal.prototype.init = function() {;
            this.bar    = "bar";
        };

        Animal.prototype.foo = function() {
            console.log(this.bar);
        };

        // Класс, меняющий поведение базового
        function Rabbit() {
            this.init();
        }

        Rabbit.prototype.foo = function() {
            console.log(this.bar, "rabbit");
        };

        // Использую ф-цию extend
        function extend(Child, Parent) {
            var F = function() { }
            F.prototype = Parent.prototype
            Child.prototype = new F()
            Child.prototype.constructor = Child
            Child.superclass = Parent.prototype
        }

        // Наследуем
        extend(Rabbit, Animal);

        var animal = new Animal();
        var rabbit = new Rabbit();

        animal.foo();
        rabbit.foo(); // Вызывается Animal.prototype.foo() !!, но я же переопределил его?

Собственно не исключаю, что я вообще неправильно использую механизм.
Я понимаю прототипное наследование как "взял объект, похожий на тот, который нужен, переделал в нем пару методов и используешь", что отличается от стандартного классового подхода, где нужно стараться выстраивать иерархию классов.

Помогите, пожалуйста

Gvozd 13.09.2012 12:41

Код в строки 19-21 надо вызывать после 33-й строки
Иначе получается, что вы при вызове extend-а затираете свой прототип, объявленный выше

vashurin 18.09.2012 11:20

Начните с более простого примера прототипов и наследования, кстати, не требующего дополнительных функций :) :
function Car() {       
}
Car.prototype.constructor = Car
// Определяем новый метод "класса" Car.
Car.prototype.drive = function() {
}
//** Производный "класс" Zaporojets 
function Zaporojets() {
       
}
// Говорим, что прототип Car - "класс" Zaporojets.
Zaporojets.prototype = new Car();

// Определяем новый метод "класса" Zaporojets.
Zaporojets.prototype.crack = function() {
}

Тогда и свой код поймете быстрее. В принципе, в JS не требуется особых промежуточных функций для объявления прототипов и наследования прототипов.
Или вот еще метод работы с прототипами и наследования классов:
Car = function() {
        document.writeln("Вызван конструктор Car().<br/>");
    }
    // Определяем новый метод "класса" Car.
    Car.prototype.drive = function () {
        document.writeln("Вызван Car.drive().<br/>");
    }
    Zaporojets = function() {
        document.writeln("Вызван конструктор Zaporojets().<br/>");
        var car = new Car();
        var $this = this;
        car.color = function (color) {
            $this.color(color);
        }
        car.crack = this.crack;

        // скопировать метод drive родителя в замыкание
         var super_drive = car.drive;
         /* перекрыть метод */
        car.drive = function(distance) {
            document.writeln("Вызван Zaporojets.drive().<br/>");
            // вызвать родительский метод
            return super_drive.call(this, distance);
        }
        car.constructor = arguments.callee;
        return car;
    }
    // Определяем новый метод "класса" Zaporojets.
    Zaporojets.prototype.crack = function () {
        document.writeln("Вызван Zaporojets.crack().<br/>");
    }
    Zaporojets.prototype.color = function (color) {
        var c = color || 'white';
        document.writeln("Вызван Zaporojets.color(); Цвет: " + c + '<br/>');
    }


    document.writeln("Программа запущена.<br/>");

    // Создаем объект производного "класса" Zaporojets.
    var vehicle = new Zaporojets();
    vehicle.drive(); // вызывается функция базового объекта
    vehicle.color();
    document.writeln("<br/>---------------------------------<br/><br/>");
    // Создаем еще один объект того же класса.
    var other = new Zaporojets();
    other.crack(); // функция производного объекта
    other.color('blue');


Часовой пояс GMT +3, время: 18:28.