whirlwind
TDD infected, paranoid
JS ООП: виртуальные функции, наследование
Дошли руки до большого кода - понял, что без классов будет бардак. Заморочился наследованием и прочими нужными вещами. Вот что получилось
Это пример базового класса, в котором у нас базовые реализации методов method и print. Атрибут className задавать не обязательно, если мы не хотим делать instanceof
Далее, первый наследник в иерархии некий MyClass
В этом классе мы частично изменяем поведение метода method. Так как у нас this.parent это экземпляр базового объекта, мы можем обратиться к базовой реализации этого метода. Главное - вызвать его в контексте текущего объекта. Это достигается путем вызова метода apply - расширения объекта function, предоставленное библиотекой prototype.
Как мы выдим, то что не перегружалось, то так и осталось - в данном случае это значение атрибута instance.someAttr и поведение метода print.
Теперь следующий уровень наследования
В этом классе переопределяется т.н. драйвер вывода. Я не стал сильно заморачиваться в этом примере, просто будем так считать
Как видим, после выполнения теста, у нас теперь полностью заменена реализация метода, который был в самом что ни на есть базовом класса. Собсно полагаю основные цели - наследование атрибутов и методов, перегрузка методов с возможностью вызова базовой реализации достигнуты. Что скажете по поводу такого ООП? Где я что упустил (что то подозрительно легко все получилось)?
PS. По поводу prototype. Вообще тут нет ничего такого, для чего нам так уж очень нужна библиотека prototype. apply - ничто иное как вызов с использованием замыкания, а Object.extend - это элементарное копирование свойств одного объекта в другой. Так что все это легко переписывается и без prototype.
Дошли руки до большого кода - понял, что без классов будет бардак. Заморочился наследованием и прочими нужными вещами. Вот что получилось
PHP:
function BaseClass(){
this.className = "BaseClass";
this.someAttr = "hello";
this.method = function(value){
this.print(this.className + " says: " + value);
};
this.print = function(value){
alert("Primary output driver >>" + value);
};
}
instance = new BaseClass();
instance.method("Hi" + " [someAttr = " + instance.someAttr + "]");
Далее, первый наследник в иерархии некий MyClass
PHP:
function MyClass(){
this.parent = new BaseClass();
Object.extend(this,this.parent);
this.className = "MyClass";
this.method = function(value){
value = "just " + value;
this.parent.method.apply(this,arguments);
}
}
instance = new MyClass();
instance.method("Hello" + " [someAttr = " + instance.someAttr + "]");
Как мы выдим, то что не перегружалось, то так и осталось - в данном случае это значение атрибута instance.someAttr и поведение метода print.
Теперь следующий уровень наследования
PHP:
function MyAnotherClass(){
this.parent = new MyClass();
Object.extend(this,this.parent);
this.className = "MyAnotherClass";
this.print = function(value){
alert(":) I think... is another output driver >>" + value);
}
}
instance = new MyAnotherClass();
instance.method("Wow" + " [someAttr = " + instance.someAttr + "]");
Как видим, после выполнения теста, у нас теперь полностью заменена реализация метода, который был в самом что ни на есть базовом класса. Собсно полагаю основные цели - наследование атрибутов и методов, перегрузка методов с возможностью вызова базовой реализации достигнуты. Что скажете по поводу такого ООП? Где я что упустил (что то подозрительно легко все получилось)?
PS. По поводу prototype. Вообще тут нет ничего такого, для чего нам так уж очень нужна библиотека prototype. apply - ничто иное как вызов с использованием замыкания, а Object.extend - это элементарное копирование свойств одного объекта в другой. Так что все это легко переписывается и без prototype.