Прототипное наследование
Здравствуйте!
Понадобилось реализовать наследование на прототипах (до этого обходился без него), прочитал учебник, но, честно говоря, запутался. Опишу, что я пытался сделать: // Базовый класс 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() !!, но я же переопределил его? Собственно не исключаю, что я вообще неправильно использую механизм. Я понимаю прототипное наследование как "взял объект, похожий на тот, который нужен, переделал в нем пару методов и используешь", что отличается от стандартного классового подхода, где нужно стараться выстраивать иерархию классов. Помогите, пожалуйста |
Код в строки 19-21 надо вызывать после 33-й строки
Иначе получается, что вы при вызове extend-а затираете свой прототип, объявленный выше |
Начните с более простого примера прототипов и наследования, кстати, не требующего дополнительных функций :) :
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. |