1

次のメディエーター パターンの実装では、initialize メソッドの this.name が常に未定義なのはなぜですか? 私はそれがTestObjectであることを期待していました。どうすればこれを達成できますか?

また、TestObject の新しいインスタンスを作成するにはどうすればよいですか?

Mediator = function() {

        var debug = function() {
            // console.log or air.trace as desired
        };

        var components = {};

        var broadcast = function(event, args, source) {
            var e = event || false;
            var a = args || [];
            if (!e) {
                return;
            }
            //debug(["Mediator received", e, a].join(' '));
            for (var c in components) {
                if (typeof components[c]["on" + e] == "function") {
                    try {
                        //debug("Mediator calling " + e + " on " + c);
                        var s = source || components[c];
                        components[c]["on" + e].apply(s, a);
                    } catch (err) {
                        debug(["Mediator error.", e, a, s, err].join(' '));
                    }
                }
            }
        };

        var addComponent = function(name, component, replaceDuplicate) {
            if (name in components) {
                if (replaceDuplicate) {
                    removeComponent(name);
                } else {
                    throw new Error('Mediator name conflict: ' + name);
                }
            }
            components[name] = component;
        };

        var removeComponent = function(name) {
            if (name in components) {
                delete components[name];
            }
        };

        var getComponent = function(name) {
            return components[name] || false;
        };

        var contains = function(name) {
            return (name in components);
        };

        return {
            name      : "Mediator",
            broadcast : broadcast,
            add       : addComponent,
            rem       : removeComponent,
            get       : getComponent,
            has       : contains
        };
    }();


    // Components    
    Mediator.add('TestObject', function() {

        var someNumber = 0; // sample variable
        var someString = 'another sample variable';

        return {
            onInitialize: function() {
                // this.name is automatically assigned by the Mediator
                alert(this.name + " initialized.");
            },
            onFakeEvent: function() {
                someNumber++;
                alert("Handled " + someNumber + " times!");
            },
            onSetString: function(str) {
                someString = str;
                alert('Assigned ' + someString);
            }
        }
    }());

    Mediator.broadcast("Initialize");                 
    Mediator.broadcast('FakeEvent');                  
    Mediator.broadcast('SetString', ['test string']); 
    Mediator.broadcast('FakeEvent');                  
    Mediator.broadcast('SessionStart');
4

1 に答える 1

2

これは、返される関数ブロックthisでは、メディエーター オブジェクトではなく、ブロック自体を表しているためです (これを確認するには、console.log(this);inonInitializeを試すことができます)。

編集

コールバックに名前コンポーネントを追加するには、そのようなことができます

var addComponent = function(varName, component, replaceDuplicate) {
    if (varName in components) {
        if (replaceDuplicate) {
            removeComponent(varName);
        } else {
            throw new Error('Mediator name conflict: ' + varName);
        }
    }
    components[varName] = component;
    components[varName].name = varName;
};

名前が多かったので、ローカルnamevarName

于 2012-05-06T21:09:14.490 に答える