• 关于JavaScript的设计模式--笔记(1)


    <!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>
  • 相关阅读:
    Webkit是如何加载网页的
    代码无错是优? 工厂模式
    JavaScript 记忆 Memoization
    输入一个新的网址后到完全显示页面,浏览器做了哪些工作?
    向服务器请求数据的五种技术
    setTimeout(0) 即将退役
    JS 对象机制深剖——new 运算符
    正则表达式中的回溯
    闭包与柯里化
    正则表达式工作原理
  • 原文地址:https://www.cnblogs.com/mujinxinian/p/5711984.html
Copyright © 2020-2023  润新知