函数声明形式:表单验证函数

1
2
3
4
5
6
7
8
9
10
11
12
13
function checkName(){
    console.log('检查用户名');
}
function checkEmail(){
    console.log('检查邮箱地址');
}
function checkPassword(){
    console.log('检查密码');
}
 
checkName();
checkEmail();
checkPassword();

函数字面量形式:

在团队开发中定义函数容易覆盖他人已经定义过的函数,将函数保存在一个变量里,这样就减少了原有功能被覆盖的风险。

1
2
3
4
5
6
7
8
9
10
11
12
var checkName = function(){
    console.log('检查用户名');
}
var checkEmail = function(){
    console.log('检查邮箱地址');
}
var checkPassword = function(){
    console.log('检查密码');
}
checkName();
checkEmail();
checkPassword();

对象属性形式:利用对象具有属性与方法的特性。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var checkObject = {
    checkName:function(){
        console.log('检查用户名');
    },
    checkEmail:function(){
        console.log('检查邮箱地址');
    },
    checkPassword:function(){
        console.log('检查密码');
    }
     
};
checkObject.checkName();
checkObject.checkEmail();
checkObject.checkPassword();

对象赋值形式:对象的另一种创建形式。

1
2
3
4
5
6
7
8
9
10
11
12
13
var checkObject = function(){};
checkObject.checkName = function(){
    console.log('检查用户名');
}
checkObject.checkEmail = function(){
    console.log('检查邮箱地址');
}
checkObject.checkPassword = function(){
    console.log('检查密码');
}
checkObject.checkName();
checkObject.checkEmail();
checkObject.checkPassword();

也是利用checkObject.checkName()进行调用。 但是这个对象的方法在创建新对象时不能被继承。

返回对象:可以将这些方法放在一个函数对象中返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var checkObject = function(){
    return {
        checkName : function(){
            console.log('检查用户名');
        },
        checkEmail: function(){
            console.log('检查邮箱地址');
        },
        checkPassword: function(){
            console.log('检查密码');
        }
    }
};
var a = new checkObject();
a.checkName();
a.checkEmail();
a.checkPassword();

每次调用这个函数时,都返回一个新对象,返回的checkObj对象与checkObject对象没有任何关系。

类方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
var checkObject  = function(){
    this.checkName = function(){
        //验证姓名
    }
    this.checkEmail = function(){
        //验证邮箱
    }
    this.checkPassword = function(){
        //验证密码
    }
}
var checkObj =new checkObject();
checkObj.checkName();

每次通过new关键词创建新对象的时候,都会对类的this上的属性进行复制, 造成了不必要的内存消耗。

prototype原型:查找绑定方法

1
2
3
4
5
6
7
8
9
10
var checkObject  = function(){};
checkObject.prototype.checkName = function(){
    //验证姓名
}
checkObject.prototype.checkEmail = function(){
    //验证邮箱
}
checkObject.prototype.checkPassword = function(){
    //验证密码
}

以上prototype需要书写多遍,可简写为:

1
2
3
4
5
6
7
8
9
10
11
12
var checkObject  = function(){};
checkObject.prototype = {
    checkName :function(){
        //验证姓名
    },
    checkEmail :function(){
        //验证邮箱
    },
    checkPassword :function(){
        //验证密码
    }
}

依赖原型依次查找,每次找到方法都是同一个。

1
2
var checkObj =new checkObject();
checkObj.checkName();

链式调用:声明的每个方法末尾将当前对象返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var checkObject  = {
    checkName : function(){
         //验证姓名
         return this;
    },
    checkEmail : function(){
         //验证邮箱
         return this;
    },
    checkPassword : function(){
         //验证密码
         return this;
    }
}

链式调用:

1
checkObject.checkName().checkEmail().checkPassword();

放在原型对象里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var checkObject  = function(){};
checkObject.prototype = {
    checkName : function(){
        //验证姓名
        return this;
    },
    checkEmail : function(){
        //验证邮箱
        return this;
    },
    checkPassword : function(){
        //验证密码
        return this;
    }
}

链式调用:

1
2
var checkObj = new checkObject();
checkObj.checkName().checkEmail().checkPassword();

Function对象扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function.prototype.addMethod = function(name, fn){
    this[name] =  fn;
}  
var method = function(){};
(或者var method = new Function();)
method.addMethod('checkName',function(){
    //验证姓名
});
method.addMethod('checkEmail',function(){
    //验证邮箱
});
method.addMethod('checkPassword',function(){
    //验证密码
});

链式定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function.prototype.addMethod = function(name, fn){
    this[name] =  fn;
    return this;
var method = function(){};
(var method = new Function();)
method.addMethod('checkName',function(){
    //验证姓名
    return this;
}).addMethod('checkEmail',function(){
    //验证邮箱
    return this;
}).addMethod('checkPassword',function(){
    //验证密码
    return this;
});

可以链式调用了:

1
method.checkName().checkEmail().checkPassword();

对于类似调用方式,还可以改成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function.prototype.addMethod = function(name, fn){
    this.prototype[name] =  fn;
}
var method = function(){};
method.addMethod('checkName',function(){
    //验证姓名
    return this;
}).addMethod('checkEmail',function(){
    //验证邮箱
    return this;
}).addMethod('checkPassword',function(){
    //验证密码
    return this;
});

这种更改之后,在调用的时候不能直接使用,要通过new关键词来创建新对象了。

1
2
var m = new Method();
m.checkName();  

实现JavaScript自定义函数的整合、链式调用及类的封装的更多相关文章

  1. 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长、宽、高分别为 8 米、5 米、3 米

    查看本章节 查看作业目录 需求说明: 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长.宽.高分别为 8 米.5 米.3 米 实现思路: 创建 HTML 页面 在页面的 < ...

  2. asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结

    通常javascript代码可以与HTML标签一起直接放在前 端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因为页面因此而变得臃肿:所以一般有良好开发习惯的程序员都会把 ...

  3. JavaScript自定义函数

    js对象转成用&拼接的请求参数(转) var parseParam=function(param, key){ var paramStr=""; if(param inst ...

  4. [译]JavaScript:函数的作用域链

    原文:http://blogs.msdn.com/b/jscript/archive/2007/07/26/scope-chain-of-jscript-functions.aspx 在JavaScr ...

  5. javascript学习(10)——[知识储备]链式调用

    上次我们简单的说了下单例的用法,这个也是在我们java中比较常见的设计模式. 今天简单说下链式调用,可能有很多人并没有听过链式调用,但是其实只要我简单的说下的话,你肯定基本上都在用,大家熟知的jQue ...

  6. Java Servlet(八):EL自定义函数

    EL自定义函数:在EL表达式中调用的某个java类的静态方法,这个静态方法需在web应用程序中进行配置才可以被EL表达式调用. EL自定义函数可以扩展EL表达式的功能,让EL表达式完成普通java程序 ...

  7. javascript篇-----函数作用域,函数作用域链和声明提前

    在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的(也就是我们不能在代码段外直接访问代码段内声明的变量),我们称之为块级作用域,然而,不同于 ...

  8. javascript链式调用实现方式总结

    方法链一般适合对一个对象进行连续操作(集中在一句代码).一定程度上可以减少代码量,缺点是它占用了函数的返回值. 一.方法体内返回对象实例自身(this) function ClassA(){ this ...

  9. Javscript的函数链式调用基础篇

    我们都很熟悉jQuery了,只能jQuery中一种非常牛逼的写法叫链式操作: $('#div').css('background','#ccc').removeClass('box').stop(). ...

随机推荐

  1. Linux常用指令---系统管理

    四.linux服务器" [have no space]"开发机dev2上不管是upa/upc上传文件时,会挂载在/目录下,而此时这里只有3G空间,通过df -h显示各大挂载点使用情 ...

  2. CS:APP2e Y86处理器模拟器∗指南

    CS:APP2e Y86处理器模拟器∗指南 Randal E.Bryant David R. O'Hallaron 2013年7月29日 本文档描述了处理器模拟器,伴随的表示在第4章Y86处理器架构的 ...

  3. Ubuntu安装uget和aria2下载工具

    Windows下的下载工具有迅雷,快车等.Ubuntu下也有强大的下载工具uget和aria2. 一.安装.uget和aria2都可以在“软件中心”中安装,但是版本太老啦,所以最好还是在终端中添加pp ...

  4. 一个基于.NET平台的自动化/压力测试系统设计简述

    AutoTest系统设计概述 AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持.(本质是一个基于协议的 ...

  5. KMP算法的Next数组详解

    转载请注明来源,并包含相关链接. 网上有很多讲解KMP算法的博客,我就不浪费时间再写一份了.直接推荐一个当初我入门时看的博客吧:http://www.cnblogs.com/yjiyjige/p/32 ...

  6. ORCHARD中文文档(翻译)

    众所周知,Orchard是.net领域最好的开源CMS之一,他使用了微软最先进的技术,有一群先进理念的支持者,但是,所有的事情在国内总得加个但是,Orchard也不例外,中文资料相对比较少,官网提供的 ...

  7. 在.net中为什么第一次执行会慢?

    众所周知.NET在第一次执行的时比第二第三次的效率要低很多,最常见的就是ASP.NET中请求第一个页面的时候要等上一段时间,而后面任意刷新响应都非常迅速,那么是什么原因导致的呢?为什么微软不解决这个问 ...

  8. WCF入门(10)

    前言 又堕落了,哎. 公司是做乙方的,工资还凑合,主要是项目基本都已完成,进去就是干维护,体会不到那种从头彻尾的成就感.项目中具体用了EF+Ado.net+WCF+WPF+(VB.net啊,坑啊,完全 ...

  9. 【The final】软件工程实践总结

    软件工程就这么告一段落了,竟然有那么一丢丢的舍不得-- 一.为拖延找的种种借口     [首先声明]以下纯粹是个人吐槽,仅作记录以便日后自己可以回顾一下往昔罢了,可以直接忽略,跳到第二大点:我的拖延之 ...

  10. Sublime-jQueryDocs

    Package Control Messages======================== jQueryDocs---------- This package shows a selected ...