JavaScript调解器模式;组件名称未定义
问题描述:
在调解器模式的以下实现中,为什么initialize方法中的this.name始终未定义?因为我期待它成为TestObject。我怎样才能做到这一点?JavaScript调解器模式;组件名称未定义
另外我如何创建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');
答
这是因为在你返回函数集团,this
代表集团本身,而不是中介对象(你可以在onInitialize
尝试console.log(this);
看到)。
编辑:
为了一个名字组件添加到您的回调,你可以做这样的事情
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
我以为this.name应该让我“TestObject”? – XGreen
“name”不是作为回调函数的对象的值。事实上,名称甚至不是Mediator的一个属性,它仅仅是一个局部变量,用于传输将用于定义'components [name]'的字符串。请参阅编辑的答案以访问名称变量。 –
对不起,你还介意帮助我创建另一个TestObject的实例? – XGreen