자바스크립트
모듈화와 클래스생성(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);