Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #41 (permalink)  
Старый 25.07.2012, 15:02
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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

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

Так же добавлен параметр 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>
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 27.01.2013 в 19:40. Причина: исправил примеры
Ответить с цитированием
  #42 (permalink)  
Старый 25.07.2012, 15:05
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

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

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


Таким образом можно будет передавать любой конструктор...
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #43 (permalink)  
Старый 25.07.2012, 15:07
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от 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>
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 27.01.2013 в 19:37. Причина: исправил примеры
Ответить с цитированием
  #44 (permalink)  
Старый 25.07.2012, 15:43
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от devote
Дык так оно тоже работает, я же написал строка/конструктор
А, сорри.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #45 (permalink)  
Старый 25.07.2012, 16:08
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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


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

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

P.S. Я не очень старался, но я не въехал в код угадывания какой входной параметр что обозначает.
Ответить с цитированием
  #46 (permalink)  
Старый 25.07.2012, 16:18
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от 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
Я не очень старался, но я не въехал в код угадывания какой входной параметр что обозначает.
А гадать и не надо, ты и так правильно все понял.

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

либо

Первый Имя,
Второй объект класса
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 26.07.2012 в 08:50. Причина: исправил примеры
Ответить с цитированием
  #47 (permalink)  
Старый 25.07.2012, 16:48
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от devote
А гадать и не надо, ты и так правильно все понял.
Ну я как бы о поддержке кода задумался... Если там изменить чего надо будет...
Ответить с цитированием
  #48 (permalink)  
Старый 25.07.2012, 16:56
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от x-yuri
Ну я как бы о поддержке кода задумался... Если там изменить чего надо будет...
ну изменения в своих классах можно любые делать, а если ты имел ввиду про изменения в ядре создания классов, хм.. не думаю что это кому то навредит.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #49 (permalink)  
Старый 25.07.2012, 16:59
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

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

либо

Первый Имя,
Второй объект класса
Ну да, jQuery-way. Так было бы красивее, имхо:

Первый Имя,
Второй объект класса,
Третий свалка (необязательный параметр)
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #50 (permalink)  
Старый 25.07.2012, 17:11
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от B~Vladi
Так было бы красивее, имхо:
возможно, но когда у вас будут огромных размеров классы, не особо удобно будет открывая файл, матать в самый низ что бы посмотреть от чего он унаследован и т.д. И есть ли вообще доп параметры.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование JavaScript на платформах Android и iPhone monolithed Мобильный JavaScript 32 08.05.2012 14:17
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
Использование dll в javascript. alexKniaz Общие вопросы Javascript 5 28.10.2008 18:56