JavaScript中介模式;组件名称未定义
在以下中介模式的实现中,为什么initialize方法中的this.name始终未定义?因为我希望它是TestObject。我怎样才能做到这一点 另外,如何创建TestObject的新实例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 = {};
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”关键字以不同的方法创建组件的另一个实例。您无法真正创建中介的新实例。但您可以使用Mediatoradd
方法添加新组件。它应该将它们放在组件
列表中。(就像您添加了TestObject及其3个函数一样)