読者です 読者をやめる 読者になる 読者になる

JavaScriptの名前空間問題

javascript

JavaScript界隈をよく知らないので問題になっているか謎ですが、自分の中では大問題です。
このライブラリ! 俺の作ったクラス名とかぶってて、知らない間に関数が再定義されて変な動きしてる! みたいなことが起こってブチキレてオレオレフレームの開発にとりかかる人も多いと思います。
そしてそのフレームワークを使った人がまたブチキレて、開発に着手と永久に続くことになるわけです。YAHOOなんかはそのことに気づいていて、YAHOOという名前空間の下にクラスを定義しているのですが、YAHOO.util.Dom.get()とか毎回書くのは長すぎで、汚染されたくない気持ちと長いのが嫌な気持ちで苦しむことになります。
そこで次のようにするとどちらも解決できるよ! と思いました。

// 定義する
var udp = {
    jp: {
        NamedObject: function()
        {
            var NamedObject = function (name) 
            {
                if (name) {
                    this.name = name;
                }
            };
            NamedObject.prototype.setName = function (name) 
            {
                this.name = name;
            };
            NamedObject.prototype.getName = function() 
            {
                return this.name;
            };
            
            return NamedObject;
        }
    }
};

// 使う

// 自分の定義した空間にインストールして使う
var MyNameSpace = {}; // オレオレ名前空間
MyNameSpace.NamedObject = udp.jp.NamedObject();

var namedObj = new MyNameSpace.NamedObject("firefox");
alert(namedObj.getName());
namedObj.setName("apache");
alert(namedObj.getName());

// グローバルな空間にインストールして使う
window.NamedObject = udp.jp.NamedObject();

var namedObj2 = new NamedObject("firefox2");
alert(namedObj2.getName());
namedObj2.setName("apache2");
alert(namedObj2.getName());

で、ここまで書いて、

var MyNameSpace { Dom: YAHOO.util.Dom };
window.Dom = YAHOO.util.Dom;

と同じ? と気づきました。
ようはグローバル空間に定義されていないなら、初期化処理として名前空間にインストールする処理を書くことで、好きな名前空間で使えるという感じか。初めに定義されている空間以外では。
普通。

using namespace

したい。けど、難しいね。
usign namespaceのスコープを見えないサブウィンドウと定義して、サブウィンドウ内にインストールして実行して、終わったらサブウィンドウを閉じる! とか思いついたのですが、documentとか使いにくくなるし重すぎなのでダメ。
起動時にソースコード分のサブウィンドウを開いて、$()をwindow.opener.document.getElementByIdを使うようにして……とか、これはメンドイか。
そもそもGoogleToolbarにブロックされる運命にある。フレーム?
いろいろ考えつつも絶対しない。