假设我们要做一个计算器程序
var calculator = { add: function( x, y ){ return x + y; }, sub: function( x, y ){ return x - y; } } // 调用 calculator.add(1,2);
通过calculator.add这样直接调用,我们实现了具有加减运算的计算器功能。不过在许多情况下,我们不希望直接访问calculator。原因是会增加其他对象对calculator的依赖。试想一下,我们已经实现了计算器功能,并在其它多个地方使用calculator.add,调用很多。此时,如果我们对calculator计算器这个对象的结构进行修改,将要同时修改所有调用计算器。这大大违背了尽可能解耦对象的OOP理论。
下面我们来修改一下代码
通过添加一个入口函数,根据输入的命令来选择调用哪个函数。代码如下:
var calculator = { add: function( x, y ){ return x + y; }, sub: function( x, y ){ return x - y; } } // 添加一个总入口,根据命令调用相应的方法 calculator.calculate = function ( method ) { return calculator[method] && calculator[method].apply( calculator, [].slice.call(arguments, 1) ); }; // 外部调用 console.log( calculator.calculate('add',1,2) );
此时外部调用降低了对calculator对象的依赖。那么回想一下先前的一个问题,calculator的结构修改会不会引起外部调用的修改?答案是不会。当calculator结构变化了,我们只需要对calculator的calculate也进行相应的调整,外部的调用不需要跟着改变。
var calculator = { box:{ add: function( x, y ){ return x + y; }, sub: function( x, y ){ return x - y; } } // other } // 添加一个总入口,根据命令调用相应的方法 calculator.calculate = function ( method ) { return calculator.box[method] && calculator.box[method].apply( calculator, [].slice.call(arguments, 1) ); }; // 调用方法一样 console.log( calculator.calculate('add',1,2) );