Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.09.2012, 12:02
Аспирант
Отправить личное сообщение для bFree Посмотреть профиль Найти все сообщения от bFree
 
Регистрация: 19.08.2008
Сообщений: 42

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

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

// Базовый класс
        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() !!, но я же переопределил его?

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

Помогите, пожалуйста
Ответить с цитированием
  #2 (permalink)  
Старый 13.09.2012, 12:41
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Код в строки 19-21 надо вызывать после 33-й строки
Иначе получается, что вы при вызове extend-а затираете свой прототип, объявленный выше
Ответить с цитированием
  #3 (permalink)  
Старый 18.09.2012, 11:20
Аспирант
Отправить личное сообщение для vashurin Посмотреть профиль Найти все сообщения от vashurin
 
Регистрация: 01.04.2008
Сообщений: 52

Начните с более простого примера прототипов и наследования, кстати, не требующего дополнительных функций :
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');
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Множественное наследование - миф или реальность?! B~Vladi Оффтопик 109 04.09.2012 16:13
Наследование от встроенного Error khusamov Общие вопросы Javascript 8 01.02.2012 13:32
Наследование класса-замыкания и вызов метода предка BobiKK Общие вопросы Javascript 2 21.03.2010 13:26
Наследование в CSS SunnyDay (X)HTML/CSS 14 06.10.2008 20:06
наследование установок динамически создаваемыми элементами majestic jQuery 1 15.09.2008 13:21