0

javascript でオブジェクト プロトタイプに名前空間メソッドを追加しようとしています。

私ができるようにしたいのはこれです:

var myObj = {}
myObj.namespace('nested.objects.are.created.if.not.present')

しかし、私は迷子になっています。一般的な関数を実行するのは非常に簡単に思えますが、プロトタイプに追加するのは簡単ではありません。

ここに私が持っているものがあります:

Object.prototype.namespace = function(ns_string) {
    var parts = ns_string.split('.');
    var parent = this;
    var i;
    var length = parts.length
    for (i = 0; i < length; i++) {
        // Create a property if it doesnt exist
        if (typeof parent[parts[i]] === "undefined") {
            parent[parts[i]] = {};
        }
        parent = parent[parts[i]];
    }
}

親の値が毎回正しく設定されていないようです。私が見逃している非常に基本的なものだと確信していますが、それが何であるかはわかりません。

前もって感謝します。

リチャード

4

1 に答える 1

1

まず最初に、オンケルボルグが言ったように、これは良い考えではありません(私はそれが非常に悪い考えであるとさえ言うでしょう)。コアオブジェクトのプロトタイプにプロパティを追加することは、問題を引き起こしているだけです。このメソッドを追加すると、サイトの一部のコード(自分のものである可能性があり、ライブラリからのものである可能性があります)は次のようになります。

for (var key in {foo: 'bar'}) {
    // How many times will this iterate?
}

そのループは、「foo」をキーとして取得して、1回だけ繰り返す必要があります。ただし、実際には、「名前空間」プロパティがプロパティとして表示されるため、2回ループします。

そうは言っても、とにかくこれを本当にやりたいのであれば、基本的なコードは機能するはずです。の値を台無しにする可能性がある唯一のことparentは、オフの場合です。そのためには、別の「this」を使用して、またはそのようなものthisを使用してメソッドを呼び出す必要があります。foo.namespace.call(bar)

使用していないcall(または兄弟であるapply)場合は、すべてが機能するはずです。

于 2012-07-17T21:42:03.863 に答える