Codebits
that rock!

Oct 16, 2012

JavaScript: hiding class implementation

posted by varnie • Tags: jsShow comments

Открыл для себя простой удобный способ спрятать реализацию класса в 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(); 
})();

Проблема всплывает в случае если имплементации классов слишком большие. В этом случае по-просту будет неэстетично постить “жирные” имплементации в одну функцию, но все же, вариант рабочий.


blog comments powered by Disqus
Fork me on GitHub