JS模式--状态模式(状态机)下⾯的状态机选择通过Function.prototype.call⽅法直接把请求委托给某个字⾯量对象来执⾏。
var light = function () {
this.currstate = FSM.off;
this.button = null;
};
light.prototype.init = function () {
var button = ateElement('button');
self = this;
button.innerHTML = '已关灯';
this.button = document.body.appendChild(button);
lick = function () {
self.currstate.buttonWasPressed.call(self);
};
};
var FSM = {
off: {
buttonWasPressed: function () {
console.log('关灯');
this.button.innerHTML = '下⼀次按我是开灯';
this.currstate = ;
}
},
on: {
buttonWasPressed: function () {
console.log('开灯');
this.button.innerHTML = '下⼀次按我是关灯';
this.currstate = FSM.off;
}
}
};
var light = new light();
light.init();
下⾯利⽤delegate函数来重写⼀遍这个状态机
js arguments这是⾯向对象和闭包互换的⼀个例⼦。前者将变量保存为对象的属性,后者将变量封闭在闭包形成的环境中:var delegate = function (client, delegation) {
return {
buttonWasPressed: function () {
return delegation.buttonWasPressed.apply(client, arguments);
}
};
};
var light = function () {
this.offstate = delegate(this, FSM.off);
this.currstate = FSM.off;
this.button = null;
};
light.prototype.init = function () {
var button = ateElement('button');
self = this;
button.innerHTML = '已关灯';
this.button = document.body.appendChild(button);
lick = function () {
self.currstate.buttonWasPressed.call(self);
};
};
var FSM = {
off: {
buttonWasPressed: function () {
console.log('关灯');
this.button.innerHTML = '下⼀次按我是开灯';
this.currstate = state;
}
},
on: {
buttonWasPressed: function () {
console.log('开灯');
this.button.innerHTML = '下⼀次按我是关灯';
this.currstate = this.offstate;
}
}
};
var light = new light();
light.init();
Github上有另外⼀种⽅式:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。