Прототипное наследование
Здравствуйте!
Понадобилось реализовать наследование на прототипах (до этого обходился без него), прочитал учебник, но, честно говоря, запутался. Опишу, что я пытался сделать:
// Базовый класс
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, время: 14:13. |