Посоветуйте маленькую ооп библиотеку
Подскажите пожалуйста компактыне библиотеки предназначенные именно для создание больших и гибких проектов на 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, время: 20:56. |