JavaScript: hiding class implementation
Открыл для себя простой удобный способ спрятать реализацию класса в JavaScript. Сначала покажу код:
var myFooObj = (function(){
var FooClass = function() {};
FooClass.prototype = {
//some data
};
return new FooClass();
})();
Как видно, вся хитрость в самовызываемой анонимной функции. Никто не запретит передать в класс какие-либо данные для инициализации, например:
var myFooObj = (function(val){
var FooClass = function() {};
FooClass.prototype = {
value: val
};
return new FooClass();
})(43);
console.log(myFooObj.value); //43
Здесь уже сработает механизм замыканий.
Мы можем пойти дальше и реализовать наследование:
var myChildObj = (function(){
var ParentClass = function() {};
ParentClass.prototype = {
//some data
};
function extendsClass(childClass, parentClass, isRewrite) {
for(var property in parentClass.prototype) {
if (isRewrite ||
(!isRewrite &&
!isDefined(childClass.prototype[property]))) {
childClass.prototype[property] = parentClass.prototype[property];
}
}
childClass.prototype.parent = parentClass.prototype;
}
var ChildClass = function() {};
ChildClass.prototype = {
//some data
}
extendsClass(ChildClass, ParentClass, false);
return new PhotoGallerySingle();
})();
Проблема всплывает в случае если имплементации классов слишком большие. В этом случае по-просту будет неэстетично постить “жирные” имплементации в одну функцию, но все же, вариант рабочий.