/* 业务逻辑: 1、如果person见到person,ET见到ET,则相互sayHi; 2、如果person见到ET,则逃跑; 3、如果ET见到person,则吃掉;
ps: 举个这样蹩脚的例子,是想说明:call非常适合用在这种需要解耦代码的情况中,避免同样代码再写一次。
*/ //这个person对象有一个sayHi和run 逃跑方法 function Person(name){ this.type="person"; this.level = 1; this.name=name; }; Person.prototype={ sayHi:function(obj){console.log("hi! "+obj.name)}, run:function(obj){console.log("run! It‘s " + obj.type)} } //这个ET(外星人)对象也有一个sayHi方法,不过肯定是用外星语打招呼,还有一个把人吃掉的eat方法 function ET(name){ this.type="ET"; this.level = 2; this.name=name; }; ET.prototype = { sayHi:function(obj){console.log("ET language say hi to "+obj.name)}, eat:function(obj){console.log("eating a person! named "+ obj.name)} }; /*
这个someMethod前面加个window,只是为了显式说明someMethod是一个window对象的方法。
它是游戏主控逻辑中的情节判断逻辑,是person对象 和 ET对象 都需要的一段代码,通过使用call可以把它解耦出来。
如果日常工作的业务逻辑中有这种类似的情况,我们可以使用call来解耦。
*/ window.someMethod = function(obj){ if(this.type === obj.type) { this.sayHi(obj); }else{ if(this.level < obj.level){ this.run(obj); }else{ this.type==="ET" ? this.eat(obj) : this.sayHi(obj); } } } var ps_macliu = new Person("macliu"); var ps_tony = new Person("tony"); var et_1 = new ET("ET1"); var et_2 = new ET("ET2"); //人类遇到人类 someMethod.call(ps_macliu, ps_tony); // hi! tony //人类遇到外星人 someMethod.call(ps_macliu, et_1); // run! It‘s ET //外星人遇到人类 someMethod.call(et_1, ps_macliu); // eating a person! named macliu //外星人遇到外星人 someMethod.call(et_1, et_2); // ET language say hi to ET2