Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Посоветуйте маленькую ооп библиотеку (https://javascript.ru/forum/misc/11031-posovetujjte-malenkuyu-oop-biblioteku.html)

mexoboy 03.08.2010 10:36

Посоветуйте маленькую ооп библиотеку
 
Подскажите пожалуйста компактыне библиотеки предназначенные именно для создание больших и гибких проектов на js. Пересмотрел как варинты truejs, base.js, dojo - но каждый чем-то не устроил.
Буду благодарен за ссылки =)

Kolyaj 03.08.2010 10:50

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();

Например.

mexoboy 03.08.2010 11:22

Что-то знакомое... Это случаем не функция Дина Эдварда?
p.s. Как-то непонятно еще, почему расширяя прототип Function вызов этого метода проходит на типе Object?

Octane 03.08.2010 11:26

Цитата:

Сообщение от mexoboy
Как-то непонятно еще, почему расширяя прототип Function вызов этого метода проходит на типе Object?

alert(Object instanceof Function);
alert(Function instanceof Object);

Kolyaj 03.08.2010 11:34

Цитата:

Сообщение от mexoboy
Это случаем не функция Дина Эдварда?

Это моя функция :) переделанная из той самой. Впрочем все реализации из неё переделаны.

Цитата:

Сообщение от mexoboy
p.s. Как-то непонятно еще, почему расширяя прототип Function вызов этого метода проходит на типе Object?

Лучше так
alert(typeof Object);

Riim 03.08.2010 13:55

У меня так:

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 нубы писали.

Kolyaj 03.08.2010 13:59

Цитата:

Сообщение от Riim
т. е. если не указан родитель, то им становится Function.

Очень, очень странно. Создаёшь конструктор ничего не наследующий, а у его объектов херак, всякие apply, call, которые ещё и не работают.

eai 01.11.2010 19:06

Сижу вырываю код из закрытого проекту 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);

tenshi 06.11.2010 15:12

и чем каждый не устроил?

monolithed 07.11.2010 11:51

Цитата:

Сообщение от mexoboy
Что-то знакомое... Это случаем не функция Дина Эдварда?

А мне наработки Дугласа Крокфорда:)


Часовой пояс GMT +3, время: 16:31.