1

これの前に私が尋ねた質問に基づいて、この文字列をどのように修飾しますか...

"MyCustomObject.prototype.foo.bar"

これに:

window['MyCustomObject']['prototype']['foo']['bar']

オブジェクト形式で?(資格があってはなりません...

"window['MyCustomObject']['prototype']['foo']['bar']"

...文字列として!)。

参考までに、次のことを考慮してください...(コードが間違っています...修正が必要です(evalキーワードなしで))

var fn = "MyCustomObject.prototype.foo.bar";
var ptr = fn.split('.');
var ptrPath = 'window'
for(var index = 0; index < ptr.length; index++) {
    ptrPath += '[\'' + ptr[index] + '\']';
}
ptrPath = function() {
    alert("Hello");
}

これに解決する必要があります。

var inst = new MyObject();
inst.foo.bar();  //alerts...."Hello"
4

3 に答える 3

0

私はあなたのニーズに合うようにこの質問の答えを修正しました。

var getPropertyByName = function (fullString, context) {
        var namespaces = fullString.split(".");
        var functionName = namespaces.pop();

        for (var i = 0; i < namespaces.length; i++) {
            context = context[namespaces[i]];
        }

        return context[functionName];
};

getPropertyByName('MyCustomObject.foo.bar', window);

http://jsfiddle.net/jbabey/4GVUK/

于 2012-08-30T14:51:23.570 に答える
0

あなたはこの方法を試すことができます:

var fn = "foo.prototype.bar";
var ptr = fn.split('.');
var func = ptr.reduce(function(a, b){
    return a[b] ? a[b] : a;
}, window);

作業デモ。

于 2012-08-30T14:57:55.390 に答える
0

最後に、多くの努力の末、私は解決策を見つけました。

Object.implement関数の背後にある考え方は、開発者が次のことを行えるようにすることです。

  1. オブジェクトの存在に関係なく、オブジェクト/関数を名前(EG"Custom"または"Custom.prototype.foo.bar")で定義します。

  2. オブジェクト/関数コンテキストを定義します(EGウィンドウ)

  3. オブジェクト/関数の実装を定義する

  4. 実装がすでに存在する場合にオブジェクト/関数をオーバーライドするかどうかを定義します。

Object.implementコードサンプルを考えてみましょう。

Object.implement = function(fn, context, implementation, override) {
    var properties = fn.split('.');
    var fnName = properties.pop();
    for(var index = 0; index < properties.length; index++) {
        if(!context[properties[index]]) {
            context[properties[index]] = { };
        }
        context = context[properties[index]];
    }
    if(!context[fnName] || override) {
        context[fnName] = implementation;
    }
};

これを使用して、オブジェクトと関数を安全に作成/実装できるようになりました。これを「シム」機能に少し似ていると考えてください。関数が存在しない場合は実装を提供できますが、既存の機能をオーバーライドできる機能が追加されています。

Object.implement("HashTable", window, function() { }, true);
Object.implement("HashTable.prototype.bar", window, function() { alert("Hello World") }, true);

var ht = new HashTable();
ht.bar();

それはFireFoxで動作します...私はまだ他のブラウザでテストしていません!

于 2012-08-31T12:03:08.223 に答える