Очередное обновление.
Добавлена возможность множественного наследования, так же внесены изменения во входные параметры. Так же добавлен параметр 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> |
Почему бы не сделать так:
Class("Foo", { // контекст в котором будет создан класс __context: window, // строка/конструктор от которого будем наследоваться __extends: Class.Bar, // строка/конструктор или список строк/конструкторов, из которых будут получены дополнительные свойства __implements: [ Class.IBase, Class.IPersistent ] }, { // code }); Таким образом можно будет передавать любой конструктор... |
Цитата:
<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> |
Цитата:
|
А теперь получается, что первый аргумент - имя класса, третий - прототип, а второй - свалка для всего остального, отчасти это статические свойства, отчасти параметры для функции. Я бы тогда поместил статические свойства в отдельный параметр и убрал двойное подчеркивание:
Class("Foo", { context: window, extends: "Bar", implements: [ "IBase", "IPersistent" ], static: { STATIC_PARAM: 1, STATIC_CONST: "lala"} }, { // code }); Кстати, можно как-то в прототипе указать конструктор? Или надо для этого указывать функцию вместо объекта? Ну и, предыдущий интерфейс остался же? Я считаю, не стоит стремится всем угодить. P.S. Я не очень старался, но я не въехал в код угадывания какой входной параметр что обозначает. ;) |
Цитата:
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!" ); Цитата:
Цитата:
Первый Имя, Второй свалка, Третий объект класса либо Первый Имя, Второй объект класса |
Цитата:
|
Цитата:
|
Цитата:
Первый Имя, Второй объект класса, Третий свалка (необязательный параметр) |
Цитата:
|
Часовой пояс GMT +3, время: 01:28. |