(Oojs에서 넘어옴)
OOjs는 객체 지향 프로그래밍을 위한 자바스크립트 라이브러리이다. 거의 미디어위키를 위해 개발된 듯 미디어위키 개발자들이 주로 만들었다. 미디어위키의 자바스크립트는 대부분 OOjs를 사용한다.
특징
보일러 플레이트가 매우 심하다, 예를 들어 아무것도 상속받지 않는 Foo 클래스를 선언한다면 다음이 필요하다.
function Foo() {
// 초기화
}
OO.initClass( Foo );
이 Foo 클래스를 상속받는 Bar 클래스를 선언하려면 다음이 필요하다.
function Bar( config ) {
Bar.super.call( this, config );
}
OO.inheritClass( Bar, Foo );
클래스 안에서 정적 변수나 정적 함수를 생성할 때 이름을 굉장히 길게 적어야 한다. Baz 클래스와 정적 변수, 정적 함수를 선언하면 이렇다.
Baz = funtion() {
// 초기화
};
// 정적 변수 선언와 초기화
Baz.static.data = 'something';
// 정적 함수 선언
Bar.static.say = function() {
// 정적 함수에서 정적 변수에 접근하기.
console.log( 'I have ' + this.constructor.static.data + '!');
}
그런데 클래스 바깥에서 정적 멤버에 접근하는 문법은 또 다르다. 위에서 선언한 Bar의 work 함수에 접근한다면 다음과 같이 적는다.
Bar.static.say();
OOUI와 같은 라이브러리에서 정의된 클래스들을 사용할 때는 네임스페이스 같은 계층 구조를 저 위부터 죽 써야 한다. 예를 들어 버튼 위젯을 상속받고 싶다면 다음과 같이 적는다.
function Buz( config ) {
OO.ui.ButtonWidget.call( config );
}
OO.inheritClass( Buz, OO.ui.ButtonWidget );
그리고 내가 만든 클래스도 어딘가 네임스페이스가 있어야 하므로 실제로는 다음과 같이 적는다. 문서도 열심히 적어야 한다.
ext.myExtension = ext.myExtension || {};
/**
* ...
*
* @class
* @extends OO.ui.ButtonWidget
*
* @constructor
* @param {object} config ...
* @cfc ...
* @cfc ...
*/
ext.myExtension.Buz = function ExtMyExtensionBuz( config ) {
// Parent constructor
OO.ui.ButtonWidget.call( config );
}
/* Initialization */
OO.inheritClass( ext.myExtension.Buz, OO.ui.ButtonWidget );
보일러 플레이트 많은 Java로 위 코드를 비슷하게 쓴다 해도 훨씬 짧고 덜 힘들다.
package ext.myExtension;
import OO.ui.ButtonWidget;
/**
* ...
*/
public class Buz extends ButtonWidget {
/**
* ...
* @param config ...
*/
public static ButtonWidget( Config config ) {
super(config);
}
}
링크
- OOjs core 문서
- npm _ oojs
- gerrit - https://gerrit.wikimedia.org/r/p/oojs/core