Наследование без Prototype
В JavaScript наследование сделано через Prototype. Почему же не сделать наследование не через него, нигде не написано. Программисту, который больше всего пишет на PHP или любом другом языке, где «Прототип», это порождающий шаблон проектирования, а не способ наследования в JavaScript, очень трудно взять и начать писать классы, поэтому их почти никто собственно и не пишет на своих сайтах, а только в каких либо изощренных задачах или в специальных библиотеках.Большая часть сайтов обходится без классов. Максимум на что можно рассчитывать, это использование какого-либо JavaScript фреймворка, где можно надеется, что это присутствует.
Мучаясь бездельем, как уже многие до меня, я попробовал реализовать классы без прототипа. И собственно говоря что-то получилось, ну а что получилось, я вам и собственно и расскажу. Пытаясь найти хоть какие-то преимущества данного способа, я увидел, что можно наследоваться в каком угодно порядке от любого количества классов.
Что такое класс? Тип объекта. А задать тип объекта можно без prototype. Как сделать ссылки на родителей? Первое, что пришло в голову, это скопировать все его методы и переменные. Наверняка пострадает производительность.
function Class(name, b, c) {
window[name] = function(){
/* Добавляем члены класса */
for(var v in c) {
this[v] = c[v];
}
/* Делаем наследование */
this.__bases = [];
for(var i = 0; i < b.length; i++) {
this.__bases.push([]);
for (var v in b[i].__dict) {
if (!c.hasOwnProperty(v) && v != 'construct') {
this[v] = b[i].__dict[v];
}
else
{
this.__bases[i][v] = function(obj, f) {
return function() {f.apply(obj, arguments)};
}(this, b[i].__dict[v]);
}
}
}
/* Вызываем конструктор */
if (c.hasOwnProperty('construct')) {
c['construct'].apply(this, arguments);
}
else
{
for(var i = 0; i < b.length; i++) {
if (b[i].__dict.hasOwnProperty('construct')) {
b[i].__dict['construct'].apply(this, arguments);
}
}
}
};
window[name].__dict = c;
}
Читать дальше →