Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Использование классов в JavaScript (https://javascript.ru/forum/project/27339-ispolzovanie-klassov-v-javascript.html)

devote 25.07.2012 15:02

Очередное обновление.

Добавлена возможность множественного наследования, так же внесены изменения во входные параметры.

Так же добавлен параметр Class.defaultContext в который вы можете указать объект, куда по умолчанию будут складываться все созданные классы, у которых явно не указан контекст.

Объявлять классы как обычно можно:
Class("Foo", {
    // code
});
если нужны указать дополнительные параметры, это теперь можно сделать так:
Class("Foo", {
    // контекст в котором будет создан класс
    context: window,
    // строка/конструктор от которого будем наследоваться
    extends: "Bar",
    // строка/конструктор или список строк/конструкторов, из которых будут получены дополнительные свойства
    implements: [ "IBase", "IPersistent" ],
    // статические параметры
    static: {
        STATIC_PARAM: 1,
        STATIC_CONST: "lala"
    }
}, {
    // code
});

Пример:
<script type="text/javascript" src="https://github.com/devote/jsClasses/raw/master/core.class.min.js"></script>
<script type="text/javascript">

	Class("Foo", {
		foo: function(){
			alert( this.__class__.className );
		},
		"get name": function() {
			return "this Foo name";
		}
	});

	Class("Bar", {
		bar: function(){
			alert( this.__class__.className );
		},
		"get name": function() {
			return "this Bar name";
		}
	});

	Class("Tre", Foo, {
		trefoo: function(){
			alert( this.__class__.className );
		}
	});

	Class("Mix", {
	    extends: "Tre",
	    implements: "Bar"
	}, {
	});

	var a = new Mix();
	a.foo();
	a.bar();
	a.trefoo();
	alert( a.name );
</script>
или так:
<script type="text/javascript" src="https://github.com/devote/jsClasses/raw/master/core.class.min.js"></script>
<script type="text/javascript">

	Class("Foo", {
		foo: function(){
			alert( this.__class__.className );
		},
		"get name": function() {
			return "this Foo name";
		}
	});

	Class("Bar", {
		bar: function(){
			alert( this.__class__.className );
		},
		"get name": function() {
			return "this Bar name";
		}
	});

	Class("Tre extends Foo", {
		trefoo: function(){
			alert( this.__class__.className );
		}
	});

	Class("Mix extends Tre, Bar", {
	});

	var a = new Mix();
	a.foo();
	a.bar();
	a.trefoo();
	alert( a.name );

	// или
	Class("Mix2", "Tre, Bar", {
	});

	var a = new Mix2();
	a.foo();
	a.bar();
	a.trefoo();
	alert( a.name );
</script>

B~Vladi 25.07.2012 15:05

Почему бы не сделать так:

Class("Foo", {
    // контекст в котором будет создан класс
    __context: window,
    // строка/конструктор от которого будем наследоваться
    __extends: Class.Bar,
    // строка/конструктор или список строк/конструкторов, из которых будут получены дополнительные свойства
    __implements: [ Class.IBase, Class.IPersistent ]
}, {
    // code
});


Таким образом можно будет передавать любой конструктор...

devote 25.07.2012 15:07

Цитата:

Сообщение от B~Vladi
Почему бы не сделать так:

Дык так оно тоже работает, я же написал строка/конструктор
<script type="text/javascript" src="https://github.com/devote/jsClasses/raw/master/core.class.min.js"></script>
<script type="text/javascript">

    Class("IBase", {
        someField: 100
    });

    Class("IPersistent", {
        key: "persistentKey"
    });

    Class("Bar", {
        bar: function() {
            alert( this.__class__.className );
        }
    });

    Class("Foo", {
        // контекст в котором будет создан класс
        context: window,
        // строка/конструктор от которого будем наследоваться
        extends: Bar,
        // строка/конструктор или список строк/конструкторов, из которых будут получены дополнительные свойства
        implements: [ IBase, IPersistent ]
    }, {
        constructor: function() {
            alert( "Foo constructor execute" );
        }
    });

    var a = new Foo();

    a.bar();
    alert( a.someField );
    alert( a.key );

</script>

B~Vladi 25.07.2012 15:43

Цитата:

Сообщение от devote
Дык так оно тоже работает, я же написал строка/конструктор

А, сорри.

x-yuri 25.07.2012 16:08

А теперь получается, что первый аргумент - имя класса, третий - прототип, а второй - свалка для всего остального, отчасти это статические свойства, отчасти параметры для функции. Я бы тогда поместил статические свойства в отдельный параметр и убрал двойное подчеркивание:
Class("Foo", {
    context: window,
    extends: "Bar",
    implements: [ "IBase", "IPersistent" ],
    static: {
        STATIC_PARAM: 1,
        STATIC_CONST: "lala"}
}, {
    // code
});


Кстати, можно как-то в прототипе указать конструктор? Или надо для этого указывать функцию вместо объекта?

Ну и, предыдущий интерфейс остался же? Я считаю, не стоит стремится всем угодить.

P.S. Я не очень старался, но я не въехал в код угадывания какой входной параметр что обозначает. ;)

devote 25.07.2012 16:18

Цитата:

Сообщение от x-yuri
Кстати, можно как-то в прототипе указать конструктор? Или надо для этого указывать функцию вместо объекта?

хм.. не совсем понял что имеется ввиду. конструктор выглядит так:
Class("Foo", {
    context: window,
    extends: "Bar",
    implements: [ "IBase", "IPersistent" ],
}, {
    // это и есть конструктор, который сработает при создании экземпляра класса
    constructor: function( test ) {
        alert( test );
    }
});
new Foo( "Hello!" );
можно писать и так:
Class("Foo", {
    context: window,
    extends: "Bar",
    implements: [ "IBase", "IPersistent" ],
}, function() {
    // тут можно поместить приватные переменные, для каждого экземпляра они свои собственные.
    var private = "tarata";

    return {
        // это и есть конструктор, который сработает при создании экземпляра класса
        constructor: function( test ) {
            alert( test );
        }
    }
});
new Foo( "Hello!" );

Цитата:

Сообщение от x-yuri
Ну и, предыдущий интерфейс остался же? Я считаю, не стоит стремится всем угодить.

Я и не пытаюсь угодить всем, я пытаюсь сделать так что бы не переписывать уже написанные свои классы, я их уже штук 50 начирикал. Лениво переиначивать :(

Цитата:

Сообщение от x-yuri
Я не очень старался, но я не въехал в код угадывания какой входной параметр что обозначает.

А гадать и не надо, ты и так правильно все понял.

Первый Имя,
Второй свалка,
Третий объект класса

либо

Первый Имя,
Второй объект класса

x-yuri 25.07.2012 16:48

Цитата:

Сообщение от devote
А гадать и не надо, ты и так правильно все понял.

Ну я как бы о поддержке кода задумался... Если там изменить чего надо будет...

devote 25.07.2012 16:56

Цитата:

Сообщение от x-yuri
Ну я как бы о поддержке кода задумался... Если там изменить чего надо будет...

ну изменения в своих классах можно любые делать, а если ты имел ввиду про изменения в ядре создания классов, хм.. не думаю что это кому то навредит.

B~Vladi 25.07.2012 16:59

Цитата:

Сообщение от devote
Первый Имя,
Второй свалка,
Третий объект класса

либо

Первый Имя,
Второй объект класса

Ну да, jQuery-way. Так было бы красивее, имхо:

Первый Имя,
Второй объект класса,
Третий свалка (необязательный параметр)

devote 25.07.2012 17:11

Цитата:

Сообщение от B~Vladi
Так было бы красивее, имхо:

возможно, но когда у вас будут огромных размеров классы, не особо удобно будет открывая файл, матать в самый низ что бы посмотреть от чего он унаследован и т.д. И есть ли вообще доп параметры.


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