Вы можете использовать что-то вроде MooTools Class , который будет медленнее, чем ваш метод с «зависшим» кодом. В основном это связано с тем, что класс MooTools имеет служебную информацию, связанную с их «нативной» структурой. Многое, что вам может и не понадобиться, и, скорее всего, не понадобится Похоже, вы хотите что-то прямо в точку.
Вы можете сделать что-то вроде:
var Klass = function(attrs) {
var key, newClass;
attrs = attrs || {};
newClass = function() {
if(this.init) {
this.init.apply(this, Array.prototype.slice.call(arguments));
}
};
for(key in attrs) {
newClass.prototype[key] = attrs[key]
}
return newClass;
};
Тогда вы можете сделать что-то вроде:
var Person = new Klass({
init: function(name, bg) {
this.name = name;
document.getElementById('container').styles.background = bg;
},
speak: function() {
'I am ' + this.name;
}
});
var tim = new Person('tim', 'blue');
// background now blue
tim.speak();
// 'I am tim'
var jane = new Person('jane', 'purple');
// background now purple
jane.speak();
// 'I am jane'
Итак, этот код будет запускать init (), когда вы создаете новый экземпляр класса. Передав это какими-то аргументами. В котором вы можете поместить свой «висячий» код. Узел, который из-за того, как работают прототипы, не позволяет создавать новый экземпляр нового экземпляра. И вам нужно будет изменить его дальше, чтобы учесть такие вещи, как создание родительского класса. Но это довольно простой способ построения структуры классов.
Это должно хорошо работать для того, что вы хотите. Если вы столкнетесь с чем-то, что «не может», то наверняка найдется способ исправить это. Возможно, вам просто нужно найти код. Как я уже говорил в предыдущем абзаце. Будут небольшие накладные расходы, поскольку класс - это в основном возвращаемая функция, для которой вы затем создаете новый экземпляр. Но ничего особенного. Что касается лучших практик, я бы сказал, что это неплохо. Существует ряд библиотек JS, которые имеют достаточно обширную структуру классов для использования. И многие люди используют классы. Но есть и будут аргументы по поводу их использования, поскольку они не являются настоящими нативными типами JS.