<!DOCTYPE html> <html> <head> <title>灵活的语言---javascript</title> <meta charset="UTF-8"/> </head> <body> <section> <ul> <li><span>姓名</span><input type="text"/></li> <li><span>邮箱</span><input type="email"/></li> <li><span>密码</span><input type="password"/></li> </ul> </section> <script> var inputs=document.querySelectorAll('input'); /*---------------表单验证最不推荐的写法(因为创建了多个全局变量,不利于团队开发)---------------------------------*/ //缺点:对于团队开发而言,如果别人也定义了同样的方法就会覆盖掉原有的功能了,且这种相互覆盖问题是很不容易察觉到的 /*function checkName(){ console.log('我是验证姓名'); } function checkEmail(){ console.log('我是验证姓名'); } function checkPassword(){ console.log('我是验证姓名'); }*/ /*-----------------将函数放在局部变量里面保存,减少覆盖或被覆盖的风险------------------------------------*/ //较上一种方法的优点:减少覆盖或被覆盖的风险,一旦被覆盖,所有的功能都会失效,这种现象较容易察觉 /*var checkName=function (){ console.log('我是验证姓名'); } var checkEmail=function (){ console.log('我是验证邮箱'); } var checkPassword=function (){ console.log('我是验证密码'); }*/ /*inputs[0].addEventListener('focus',checkName,false); inputs[1].addEventListener('focus',checkEmail,false); inputs[2].addEventListener('focus',checkPassword,false);*/ /*---------------------------用对象收编变量--------------------------*/ /*var checkObject={ //创建了一个验证对象 checkName : function(){ console.log('我是验证姓名'); }, checkEmail : function (){ console.log('我是验证邮箱'); }, checkPassword : function(){ console.log('我是验证密码'); } };*/ /*---------------------------对象的另一种形式-------------------------------------*/ //使用和上一种方法是一样的,但是这个对象类在用new关键字创建新对象时,新创建的对象是不能继承这些方法的 /*var checkObject=function(){}; checkObject.checkName=function(){ console.log('我是验证姓名'); }; checkObject.checkEmail=function(){ console.log('我是验证姓名'); }; checkObject.checkPassword=function(){ console.log('我是验证姓名'); };*/ /*inputs[0].addEventListener('focus',checkObject.checkName,false); inputs[1].addEventListener('focus',checkObject.checkEmail,false); inputs[2].addEventListener('focus',checkObject.checkPassword,false);*/ /*--------------------------真假对象(不是真正意义上类的创建方式)---------------------------------------*/ //真假对象的解释:当每次调用这个函数时,把用于表单验证的对象返回出来,当别人每次调用这个函数时都返回了一个新对象,这样执行过程中明面上是checkObject对象,可实际是返回的新对象。这样每个人在使用时就互不影响了 /*var checkObject=function(){ return { checkName : function(){ console.log('我是验证姓名'); }, checkEmail : function (){ console.log('我是验证邮箱'); }, checkPassword : function(){ console.log('我是验证密码'); } } }; var a=checkObject(); inputs[0].addEventListener('focus',a.checkName,false); inputs[1].addEventListener('focus',a.checkEmail,false); inputs[2].addEventListener('focus',a.checkPassword,false); */ /*------------------------上述代码也可写成---------------------------*/ //缺点:把所有的方法放在函数内部,通过this定义的,所以每次通过new创建新对象时,新对象都会对类的this上的属性进行复制。若需要创建很多对象,则造成的消耗是奢侈的 /*var checkObject=function(){ this.checkName=function(){ console.log('我是验证姓名'); }; this.checkEmail =function(){ console.log('我是验证邮箱'); }; this.checkPassword=function(){ console.log('我是验证密码'); } }*/ /*-------------------------通过原型为对象添加方法--------------------------------*/ //优点:创建对象实例的时候,创建出来的对象所拥有的方法就都是一个了,因为他们都需要依赖prototype原型一次查找,而找到的方法是同一个 //调用三个方法,就对b书写了3遍 /* var checkObject=function(){}; checkObject.prototype={ checkName : function(){ console.log('我是验证姓名'); }, checkEmail : function (){ console.log('我是验证邮箱'); }, checkPassword : function(){ console.log('我是验证密码'); } }; var b=new checkObject(); inputs[0].addEventListener('focus',b.checkName,false); inputs[1].addEventListener('focus',b.checkEmail,false); inputs[2].addEventListener('focus',b.checkPassword,false);*/ /*--------------------------可以链式调用的改进--------------------------------------------*/ /*var checkObject={ checkName : function(){ console.log('我是验证姓名'); return this; }, checkEmail : function (){ console.log('我是验证邮箱'); return this; }, checkPassword : function(){ console.log('我是验证密码'); return this; } }; checkObject.checkName().checkEmail().checkPassword();//链式调用*/ /*-------------------------上述代码的另一种写法----------------------------------------------*/ /*var checkObject=function(){}; checkObject.prototype={ checkName : function(){ console.log('我是验证姓名'); return this; }, checkEmail : function (){ console.log('我是验证邮箱'); return this; }, checkPassword : function(){ console.log('我是验证密码'); return this; } }; var c=new checkObject(); c.checkName().checkEmail().checkPassword();*/ /*-----------------若为每个函数都添加一个验证表单的方法-----------------------*/ //优点:抽象出了一个统一添加方法的功能方法,不会污染原生对象Function,也不会造成不必要的开销 Function.prototype.addMethod=function(name,fn){ this[name]=fn; return this;//主要是为了实现链式添加而存在的 } var methods=function(){};//因为给Function的原型添加了addMethod方法,所以此处创建的这个函数对象就自动拥有了原型对象的addMethod方法 methods.addMethod('checkName',function(){ console.log('我是验证姓名'); return this;//主要是为了实现链式添加而存在的 }).addMethod('checkEmail',function(){ console.log('我是验证邮箱'); return this;//主要是为了实现链式添加而存在的 }).addMethod('checkPassword',function(){ console.log('我是验证密码'); return this;//主要是为了实现链式添加而存在的 }); methods.checkName().checkEmail().checkPassword(); </script> </body> </html>