25.07.2012, 15:02
|
что-то знаю
|
|
Регистрация: 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>
Последний раз редактировалось devote, 27.01.2013 в 19:40.
Причина: исправил примеры
|
|
25.07.2012, 15:05
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Почему бы не сделать так:
Class("Foo", {
// контекст в котором будет создан класс
__context: window,
// строка/конструктор от которого будем наследоваться
__extends: Class.Bar,
// строка/конструктор или список строк/конструкторов, из которых будут получены дополнительные свойства
__implements: [ Class.IBase, Class.IPersistent ]
}, {
// code
});
Таким образом можно будет передавать любой конструктор...
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
|
|
25.07.2012, 15:07
|
что-то знаю
|
|
Регистрация: 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>
Последний раз редактировалось devote, 27.01.2013 в 19:37.
Причина: исправил примеры
|
|
25.07.2012, 15:43
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от devote
|
Дык так оно тоже работает, я же написал строка/конструктор
|
А, сорри.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
|
|
25.07.2012, 16:08
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
А теперь получается, что первый аргумент - имя класса, третий - прототип, а второй - свалка для всего остального, отчасти это статические свойства, отчасти параметры для функции. Я бы тогда поместил статические свойства в отдельный параметр и убрал двойное подчеркивание:
Class("Foo", {
context: window,
extends: "Bar",
implements: [ "IBase", "IPersistent" ],
static: {
STATIC_PARAM: 1,
STATIC_CONST: "lala"}
}, {
// code
});
Кстати, можно как-то в прототипе указать конструктор? Или надо для этого указывать функцию вместо объекта?
Ну и, предыдущий интерфейс остался же? Я считаю, не стоит стремится всем угодить.
P.S. Я не очень старался, но я не въехал в код угадывания какой входной параметр что обозначает.
|
|
25.07.2012, 16:18
|
что-то знаю
|
|
Регистрация: 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
|
Я не очень старался, но я не въехал в код угадывания какой входной параметр что обозначает.
|
А гадать и не надо, ты и так правильно все понял.
Первый Имя,
Второй свалка,
Третий объект класса
либо
Первый Имя,
Второй объект класса
Последний раз редактировалось devote, 26.07.2012 в 08:50.
Причина: исправил примеры
|
|
25.07.2012, 16:48
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от devote
|
А гадать и не надо, ты и так правильно все понял.
|
Ну я как бы о поддержке кода задумался... Если там изменить чего надо будет...
|
|
25.07.2012, 16:56
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от x-yuri
|
Ну я как бы о поддержке кода задумался... Если там изменить чего надо будет...
|
ну изменения в своих классах можно любые делать, а если ты имел ввиду про изменения в ядре создания классов, хм.. не думаю что это кому то навредит.
|
|
25.07.2012, 16:59
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от devote
|
Первый Имя,
Второй свалка,
Третий объект класса
либо
Первый Имя,
Второй объект класса
|
Ну да, jQuery-way. Так было бы красивее, имхо:
Первый Имя,
Второй объект класса,
Третий свалка (необязательный параметр)
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
|
|
25.07.2012, 17:11
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от B~Vladi
|
Так было бы красивее, имхо:
|
возможно, но когда у вас будут огромных размеров классы, не особо удобно будет открывая файл, матать в самый низ что бы посмотреть от чего он унаследован и т.д. И есть ли вообще доп параметры.
|
|
|
|