OOjs객체 지향 프로그래밍을 위한 자바스크립트 라이브러리이다. 거의 미디어위키를 위해 개발된 듯 미디어위키 개발자들이 주로 만들었다. 미디어위키의 자바스크립트는 대부분 OOjs를 사용한다.

1 특징

보일러 플레이트가 매우 심하다, 예를 들어 아무것도 상속받지 않는 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);
    }
}


2 링크