Очередное обновление.
Добавлена возможность множественного наследования, так же внесены изменения во входные параметры. Так же добавлен параметр 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, время: 16:30. |