javaScript设计模式 -- 灵活的javaScript语言
2018-06-24 01:47:44来源:未知 阅读 ()
因为好长时间的懒惰和懈怠,好久没有更新文章了,从现在开始我会按时更新一些自己总结的一些知识,和研究的东西,希望能让大家从我这里学到一点点的知识。
本文参考了张荣铭的javascript设计模式一书,算是自己对看了文章的总结吧,如果你想学习设计模式,可以去购买一本,学习一下,写的非常好。
在我们的开发中,如果给了自己一些验证姓名、邮箱、密码的任务,按照下面的写法看
1 //这样写就会污染到全局变量 都会挂载到window下 2 function checkName() { 3 //验证姓名 4 } 5 function checkEmail() { 6 //验证邮箱 7 } 8 function checkPassword() { 9 //验证密码 10 }
声明的方式,还有另外一种
1 var checkName = function () { 2 //验证姓名 3 }; 4 var checkEmail = function () { 5 //验证邮箱 6 }; 7 var checkPassword = function () { 8 //验证密码 9 }
上面的两种声明方式都会产生好多全局变量,会影响其他人的使用,命名,所以我们可以把这些放到一个对象下面
1 var checkObject = { 2 checkName : function () { 3 //验证姓名 4 }, 5 checkEmail : function () { 6 //验证邮箱 7 }, 8 checkPassword : function () { 9 //验证密码 10 } 11 }
//还有另外一种添加方式
1 var checkObject = function(){} 2 checkObject.checkName = function(){} 3 checkObject.checkEmail = function(){} 4 checkObject.checkPassword = function(){}
虽然这样可以满足自己的需求,但是当别人想用你写的对象的方法时候就麻烦了,因为这个对象不能复制一份
要实现复制一份看下面的写法
1 var checkObject = function() { 2 return { 3 checkName : function(){ 4 //验证姓名 5 }, 6 checkEmail : function () { 7 //验证邮箱 8 }, 9 checkPassword : function () { 10 //验证密码 11 } 12 } 13 }; 14 ? 15 var a = checkObject(); 16 console.log(a); 17 a.checkEmail();
上面的方法虽然可以实现我们的功能,但是创建出来的对象a和对象checkObject没有任何关系
我们对其进行改造一下
1 var CheckObject = function () { 2 this.checkName = function () { 3 //验证姓名 4 }; 5 this.checkEmail = function () { 6 //验证邮箱 7 }; 8 this.checkPassword = function () { 9 //验证密码 10 } 11 }; 12 ? 13 var a = new CheckObject(); 14 console.log(a);
上面这种方式已经实现了复制,但是我们每一次通过new关键字创建新对象的时候,新创建的对象都会经过this再执行一次,所以这些
新创建的对象都会有属于自己的一套方法,然后有时候这么做造成的性能消耗是非常奢侈的,我们需要处理一下,?
将公有的方法放到构造函数的原型上
1 var CheckObject = function () { 2 }; 3 ? 4 CheckObject.prototype.checkName = function () { 5 //验证姓名 6 }; 7 CheckObject.prototype.checkEmail = function () { 8 //验证邮箱 9 }; 10 CheckObject.prototype.checkPassword = function () { 11 //验证密码 12 };
这样创建对象实例的时候,找方法的时候如果自己本身没有的话就会上原型上面一层一层的去找,就可以拥有方法了
上面的方法要把peototype写好多遍,还可以写成另外的一种形式
1 CheckObject.prototype = { 2 checkName : function(){ 3 //验证姓名 4 }, 5 checkEmail : function () { 6 //验证邮箱 7 }, 8 checkPassword : function () { 9 //验证密码 10 } 11 }; 12 //这两种方法不能混着用,要不然会覆盖 13 //使用方法 14 ? 15 var a = new CheckObject(); 16 console.log(a); 17 a.checkEmail();
经常使用jQ都知道链式操作,其实实现方法很简单就是将当前的对象作为函数的返回值return出去就行了,
链式操作
1 var CheckObject = function () { 2 this.checkName = function () { 3 //验证姓名 4 return this; 5 }; 6 this.checkEmail = function () { 7 //验证邮箱 8 return this; 9 }; 10 this.checkPassword = function () { 11 //验证密码 12 return this; 13 } 14 }; 15 var obj = new CheckObject(); 16 obj.checkEmail().checkName().checkPassword();
函数的祖先
1 Function.prototype.checkEmail = function () { 2 console.log('验证了邮箱'); 3 }; 4 //我们在他的原型上写了一个这样的方法之后,凡是用函数构造出来的对象都有了这个方法 5 var a = function () { 6 ? 7 }; 8 a.checkEmail();
如果习惯类的形式还可以这样写
1 var f = new Function(){}; 2 f.checkEmail();
但是这样做 在这里是不允许的 因为污染了全局变量Function
可以用这种方法就可以避免了
1 Function.prototype.addMethod = function (name,fn) { 2 this[name] = fn; 3 }; 4 ? 5 var methods = function () { 6 ? 7 }; 8 methods.addMethod('checkName',function () { 9 //验证姓名 10 console.log('姓名'); 11 }); 12 methods.addMethod('checkEmail',function () { 13 //验证邮箱 14 console.log('邮箱'); 15 }); 16 ? 17 methods.checkName(); 18 methods.checkEmail();
当然上面你嫌写了好多个methods对象,你可以用链式方法
1 Function.prototype.addMethod = function (name,fn) { 2 this[name] = fn; 3 return this; //在这里返回对象就可以了 4 }; 5 ? 6 var methods = function () { 7 ? 8 }; 9 methods.addMethod('checkName',function () { 10 //验证姓名 11 console.log('姓名'); 12 }).addMethod('checkEmail',function () { 13 //验证邮箱 14 console.log('邮箱'); 15 }); 16 ? 17 methods.checkName(); 18 methods.checkEmail();
对于习惯类的人来说也可以这样写
当然习惯用类的人来说 也可以写成类的形式
?
1 Function.prototype.addMethod = function (name,fn) { 2 this.prototype[name] = fn; 3 return this; 4 }; 5 ? 6 var Methods = function(){}; 7 ? 8 Methods.addMethod('checkName',function () { 9 //验证姓名 10 console.log('姓名'); 11 }).addMethod('checkEmail',function () { 12 //验证邮箱 13 console.log('邮箱'); 14 }); 15 ? 16 var m = new Methods(); 17 ? 18 m.checkName(); 19 m.checkEmail();
javaScript是一种灵活的语言,使用javascript可以编写出更多的优雅的代码艺术,我会在接下来的一段时间内将一些常用的设计模式的写法,分享给大家,如果你能学到一些知识,我会非常开心的,文章如有不足之处,还望可以提醒。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- javascript面向对象入门基础详细介绍 2020-03-29
- JavaScript函数表达式详解及实例 2020-03-25
- 如何用javascript连接access数据库 2020-03-20
- js中去掉字串左右空格 2020-03-20
- Javascript中的经典技巧 2020-03-20
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash