Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中介模式;组件名称未定义_Javascript_Design Patterns_Mediator - Fatal编程技术网

JavaScript中介模式;组件名称未定义

JavaScript中介模式;组件名称未定义,javascript,design-patterns,mediator,Javascript,Design Patterns,Mediator,在以下中介模式的实现中,为什么initialize方法中的this.name始终未定义?因为我希望它是TestObject。我怎样才能做到这一点 另外,如何创建TestObject的新实例 Mediator = function() { var debug = function() { // console.log or air.trace as desired }; var components = {};

在以下中介模式的实现中,为什么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');

这是因为在您返回的函数bloc中,
this
表示bloc本身,而不是中介对象(您可以尝试
console.log(this);
onInitialize
中查看)

编辑

要向回调中添加名称组件,可以执行类似的操作

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;
};

有很多名称,所以我将本地的
name
更改为
varName

,我认为这个.name应该给我“TestObject”?“name”不是回调对象的值。事实上,name甚至不作为Mediator的属性存在,它只是一个用于传输字符串的局部变量,该字符串将用于定义
组件[name]
。请参阅编辑后的答案以获取对名称变量的访问。对不起,您是否介意帮助我创建TestObject的另一个实例?与此模式一样,我不知道如何使用“new”关键字以不同的方法创建组件的另一个实例。您无法真正创建中介的新实例。但您可以使用Mediator
add
方法添加新组件。它应该将它们放在
组件
列表中。(就像您添加了TestObject及其3个函数一样)