Посоветуйте маленькую ооп библиотеку
Подскажите пожалуйста компактыне библиотеки предназначенные именно для создание больших и гибких проектов на js. Пересмотрел как варинты truejs, base.js, dojo - но каждый чем-то не устроил.
Буду благодарен за ссылки =) |
function mixin(dst) { for (var i = 1; i < arguments.length; i++) { for (var prop in arguments[i]) { if (arguments[i].hasOwnProperty(prop)) { dst[prop] = arguments[i][prop]; } } } return dst; } Function.prototype.inherit = function(proto) { var that = this; proto = proto || {}; var constructor = proto.hasOwnProperty('constructor') ? proto.constructor : function() { that.apply(this, arguments); }; var F = function() {}; F.prototype = this.prototype; constructor.prototype = mixin(new F(), proto); constructor.superclass = this.prototype; constructor.prototype.constructor = constructor; return constructor; }; // =============================================== var A = Object.inherit({ constructor: function(foo) { this.foo = foo; }, alert: function() { alert(this.foo); } }); var B = A.inherit({ constructor: function(foo) { B.superclass.constructor.apply(this, arguments); this.bar = foo + 1; }, alert: function() { B.superclass.alert.apply(this, arguments); alert(this.bar); } }); var b = new B(1); b.alert(); Например. |
Что-то знакомое... Это случаем не функция Дина Эдварда?
p.s. Как-то непонятно еще, почему расширяя прототип Function вызов этого метода проходит на типе Object? |
Цитата:
alert(Object instanceof Function); alert(Function instanceof Object); |
Цитата:
Цитата:
alert(typeof Object); |
У меня так:
Object.extend = function(self, obj, skip) { if (self == null) self = {}; if (skip) for (var key in obj) key in self || (self[key] = obj[key]); else for (var key in obj) self[key] = obj[key]; return self; }; var Class = { create: function(parent, declaration) { var klass = function() { this.initialize.apply(this, arguments); }; if (typeof parent == 'function') { var falseConstr = function() {}; falseConstr.prototype = parent.prototype; klass.prototype = new falseConstr(); } else if (parent) { declaration = parent; parent = null; } Object.extend(klass.prototype, declaration).initialize || (klass.prototype.initialize = Function.blank); klass.prototype.$super = (klass.$super = parent || Object).prototype; return klass.prototype.constructor = klass; } }; Только я не уверен, что все правильно, особенно вот в этой строчке: klass.prototype.$super = (klass.$super = parent || Object).prototype; В ajaxoop (http://ajaxoop.org/) эта строка написана так: _class.prototype.$super = parent ? parent.prototype : Function.blank.prototype; _class.prototype.$_super = parent ? parent : Function.blank; т. е. если не указан родитель, то им становится Function. Не понимаю зачем они так сделали, я родителем Object делаю, у Kolyaj тоже так, в общем либо я нуб, т. к. все еще чего-то не понимаю, либо ajaxoop нубы писали. |
Цитата:
|
Сижу вырываю код из закрытого проекту ajaxoop.
Тоже на рвался на строку Function.blank.prototype Зачем то надо было создать функцию blank .... Ajax.extend( Function.prototype, { blank : function() {}, bind : function() { if (arguments.length < 2 && Ajax.isUndefined( arguments[0])) return this; var f = this, args = $a( arguments), object = args.shift(); return function() { return f.apply( object, args.concat( $a( arguments))); }; } }, true); |
и чем каждый не устроил?
|
Цитата:
|
Часовой пояс GMT +3, время: 16:31. |