Function.prototype.bindAs = function(operator){
var me = this;
return function(){
var args = [me].concat([].slice.call(arguments, 0));
return operator.apply(null, args);
};
};
var createFuse = function(){
var queue, fn, infire;
queue = [];
fn = function(process){
var args = [].slice.call(arguments, 1);
if(infire)
process.apply(null, args);
else
queue.push(function(){
process.apply(null, args);
});
};
fn.fire = function(){
while(queue.length)
queue.shift()();
infire = true;
};
return fn;
};
// 导火线模型的应用部分,从这里看起
var swfReady = createFuse(); // 创建一根导火线(在实际的复杂项目中,可根据需要任意创建多个)
var store = {
set: function(name, value){
window.alert(["set", name, value]);
}.bindAs(swfReady), // 把 set 接口挂到导火线上
get: function(name){
// TODO:
},
remove: function(name){
window.alert(["remove", name]);
}.bindAs(swfReady) // 把 remove 接口也挂到导火线上
};
// 这里模拟用户的一堆随意调用
store.set("name", "dron");
store.set("sex", "boy");
store.remove("sex");
store.set("age", 18);
setTimeout(function(){ // 这里延迟两秒,模拟 flash 加载完成
swfReady.fire(); // 由 flash 加载完成触发的导火线点火,这一步,你将看到上边一堆 set,remove 的效果了(alert)
store.set("sex", "girl"); // 这一句,说明了被挂到导火线上的接口,在点火完成后,仍然可以工作,当然不需要再次点火
}, 2000);