자바스크립트

모듈화와 클래스생성(2)

devjones 2022. 3. 20. 12:57

클래스 라이브러리에 메소드 추가하기

var Class = function() {
    var klass = function() {
        this.init.apply(this, arguments);
    }

    klass.prototype.init = function() {}

    // 프로토타입의 단축형
    klass.fn = klass.prototype;

    // 클래스의 단축형
    klass.fn.parent = klass;

    // 클래스 프로퍼티 추가
    klass.extend = function(obj) {
        var extended = obj.extended;
        for(var i in obj) {
            klass[i] = obj[i];
        }

        if(extended) extended(klass)
    }

    // 인스턴스 프로퍼티 추가
    klass.include = function(obj) {
        var included = obj.included;
        for(var i in obj) {
            klass.fn[i] = obj[i];
        }

        if(included) included(klass)
    }

    return klass;
}

오브젝트를 인자로 받아 클래스를 만드는 extend() 함수 추가.

오브젝트의 모든 속성을 탐색해서 각각의 속성을 클래스로 직접 복사한다.

 

var Person = new Class;

Person.extend({
    find: function(id) {},
    exists: function() {}
});

var person = Person.find(1);

 

include() 함수는 extend() 함수와 비슷한 방식으로 동작한다.

다만 프로퍼티를 클래스 함수로 직접 복사하지 않고 프로토타입으로 복사한다.

즉 프로퍼티를 클래스에 정적으로 추가하지 않고 클래스의 인스턴스에 추가한다.

var Person = new Class;

Person.include({
    save: function(id) {},
    destroy: function(id) {}
});

var person = new Person;
person.save();

 

extended와 included의 콜백지원도 구현한다.

넘겨진 오브젝트에 일치하는 속성이 있으면 해당 함수를 호출한다.

Person.extend({
    extended: function(klass) {
        console.log(klass, '(이)가 확장되었습니다.');
    }
})

 

모듈은 재사용할 수 있는 코드 일부분으로, 클래스 간에 공통 프로퍼티를 공유할 때 상속 대신 모듈을 이용할 수 있다.

var ORMModule = {
    save: function() {
        // 공유 함수
    }
};

var Person = new Class;
var Asset = new Class;

Person.include(ORMModule);
Asset.include(ORMModule);