博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[js高手之路]面向对象+设计模式+继承一步步改造简单的四则运算
阅读量:4621 次
发布时间:2019-06-09

本文共 5750 字,大约阅读时间需要 19 分钟。

到目前为止,我已经写完了面向对象完整的一个系列知识,前面基本属于理论,原理的理解,接下来,我们就用学到的知识来实战下吧.

看看理解原理和理论是否重要?例子从简单到复杂

一、单体(字面量)封装加减乘除

1             var Oper = { 2             add : function( n1, n2 ){ 3                 return n1 + n2; 4             }, 5             sbb : function( n1, n2 ){ 6                 return n1 - n2; 7             }, 8             mul : function( n1, n2 ){ 9                 return n1 * n2;10             },11             div : function( n1, n2 ){12                 return n1 / n2;13             },14         };15         console.log( Oper.add( 10, 20 ) ); //3016         console.log( Oper.sbb( 10, 20 ) ); //-1017         console.log( Oper.mul( 10, 20 ) ); //20018         console.log( Oper.div( 10, 20 ) ); //0.5

二、构造函数方式

1         function Oper( n1, n2 ){ 2             this.num1 = n1 || 0; 3             this.num2 = n2 || 0; 4             this.setData = function( n1, n2 ){ 5                 this.num1 = n1; 6                 this.num2 = n2; 7             }; 8             this.add = function(){ 9                 this.setData( arguments[0] || this.num1 || 0, arguments[1] || this.num2 || 0 );10                 return this.num1 + this.num2;11             };12             this.sbb = function(){13                 this.setData( arguments[0] || this.num1 || 0, arguments[1] || this.num2 || 0 );14                 return this.num1 - this.num2;15             };16             this.mul = function(){17                 this.setData( arguments[0] || this.num1 || 0, arguments[1] || this.num2 || 0 );18                 return this.num1 * this.num2;19             };20             this.div = function(){21                 this.setData( arguments[0] || this.num1 || 0, arguments[1] || this.num2 || 0 );22                 return this.num1 / this.num2;23             };24         };25 26         console.log( new Oper( 10, 20 ).add() ); //3027         console.log( new Oper(100, 200).sbb( 10, 20 ) ); //-1028         console.log( new Oper().mul( 10, 20 ) ); //20029         console.log( new Oper().div( 10, 20 ) ); //0.5

 

三、构造函数+原型对象(prototype)

1         function Oper(n1, n2) { 2             this.num1 = n1 || 0; 3             this.num2 = n2 || 0; 4         }; 5         Oper.prototype = { 6             constructor : Oper, 7             setData : function (n1, n2) { 8                 this.num1 = n1; 9                 this.num2 = n2;10             },11             add : function () {12                 this.setData(arguments[0] || this.num1 || 0, arguments[1] || this.num2 || 0);13                 return this.num1 + this.num2;14             },15             sbb : function () {16                 this.setData(arguments[0] || this.num1 || 0, arguments[1] || this.num2 || 0);17                 return this.num1 - this.num2;18             },19             mul : function () {20                 this.setData(arguments[0] || this.num1 || 0, arguments[1] || this.num2 || 0);21                 return this.num1 * this.num2;22             },23             div : function () {24                 this.setData(arguments[0] || this.num1 || 0, arguments[1] || this.num2 || 0);25                 return this.num1 / this.num2;26             }27         };28         console.log(new Oper().add(10, 20)); //3029         console.log(new Oper( 100, 200 ).sbb()); //-10030         console.log(new Oper().mul(10, 20)); //20031         console.log(new Oper().div(10, 20)); //0.5

 

四、寄生组合继承+简单工厂模式

1         function Oper( n1, n2 ){ 2             this.num1 = n1; 3             this.num2 = n2; 4         }; 5         Oper.prototype.run = function(){} 6         function object( o ){ 7             var G = function(){}; 8             G.prototype = o; 9             return new G();10         };11         function inheritPrototype( subObj, superObj ){12             var proObj = object( superObj.prototype );13             proObj.constructor = subObj;14             subObj.prototype = proObj;15         }16 17         function OperAdd( n1, n2 ){18             Oper.call( this, n1, n2 );19         }20         inheritPrototype( OperAdd, Oper );21         OperAdd.prototype.run = function(){22             return this.num1 + this.num2;23         }24 25         function OperSbb( n1, n2 ){26             Oper.call( this, n1, n2 );27         }28         inheritPrototype( OperSbb, Oper );29         OperSbb.prototype.run = function(){30             return this.num1 - this.num2;31         }32 33         function OperMul( n1, n2 ){34             Oper.call( this, n1, n2 );35         }36         inheritPrototype( OperMul, Oper );37         OperMul.prototype.run = function(){38             return this.num1 * this.num2;39         }40 41         function OperDiv( n1, n2 ){42             Oper.call( this, n1, n2 );43         }44         inheritPrototype( OperDiv, Oper );45         OperDiv.prototype.run = function(){46             return this.num1 / this.num2;47         }48 49         function OperFactory( oper, n1, n2 ){50             switch( oper ) {51                 case '+':52                     return new OperAdd( n1, n2 ).run();53                 break;54                 case '-':55                     return new OperSbb( n1, n2 ).run();56                 break;57                 case '*':58                     return new OperMul( n1, n2 ).run();59                 break;60                 case '/':61                     return new OperDiv( n1, n2 ).run();62                 break;63             }64         }65 66         console.log( OperFactory( '+', 10, 20 ) ); //3067         console.log( OperFactory( '-', 10, 20 ) ); //-1068         console.log( OperFactory( '*', 10, 20 ) ); //20069         console.log( OperFactory( '/', 10, 20 ) ); //0.5

这种方式,虽然增加了代码量, 如果这道题是实际运用,比如说后面还有很多种运算,两个数的乘方,立方,平方等等,

还有其他特殊处理等等,那么这种扩展性就非常强

转载于:https://www.cnblogs.com/ghostwu/p/7441773.html

你可能感兴趣的文章
实现接口必须要加注解@Override吗
查看>>
apicloud UISearchBar 使用方法
查看>>
【spring+websocket的使用】
查看>>
mongo二维数组操作
查看>>
localStorage之本地储存
查看>>
Archlinux 交换左Ctrl和Cap键
查看>>
java与数据结构(6)---java实现链栈
查看>>
#openstack故障处理汇总
查看>>
搜索旋转排序数组 II
查看>>
20、docker swarm
查看>>
psp工具软件前景与范围文档
查看>>
day06-三元表达式
查看>>
C# DateTime.Now详细用法
查看>>
Php中"{}"大括号的用法总结(转)
查看>>
JavaScript内存优化
查看>>
BZOJ1059: [ZJOI2007]矩阵游戏(二分图匹配)
查看>>
P3385 【模板】负环
查看>>
URI、URL 和 URN的区别
查看>>
根据表达式序列(前缀、中缀、后缀)构建表达式树
查看>>
mysql性能优化
查看>>