实现JavaScript自定义函数的整合、链式调用及类的封装
函数声明形式:表单验证函数
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自定义函数的整合、链式调用及类的封装的更多相关文章
- 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长、宽、高分别为 8 米、5 米、3 米
查看本章节 查看作业目录 需求说明: 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长.宽.高分别为 8 米.5 米.3 米 实现思路: 创建 HTML 页面 在页面的 < ...
- asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结
通常javascript代码可以与HTML标签一起直接放在前 端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因为页面因此而变得臃肿:所以一般有良好开发习惯的程序员都会把 ...
- JavaScript自定义函数
js对象转成用&拼接的请求参数(转) var parseParam=function(param, key){ var paramStr=""; if(param inst ...
- [译]JavaScript:函数的作用域链
原文:http://blogs.msdn.com/b/jscript/archive/2007/07/26/scope-chain-of-jscript-functions.aspx 在JavaScr ...
- javascript学习(10)——[知识储备]链式调用
上次我们简单的说了下单例的用法,这个也是在我们java中比较常见的设计模式. 今天简单说下链式调用,可能有很多人并没有听过链式调用,但是其实只要我简单的说下的话,你肯定基本上都在用,大家熟知的jQue ...
- Java Servlet(八):EL自定义函数
EL自定义函数:在EL表达式中调用的某个java类的静态方法,这个静态方法需在web应用程序中进行配置才可以被EL表达式调用. EL自定义函数可以扩展EL表达式的功能,让EL表达式完成普通java程序 ...
- javascript篇-----函数作用域,函数作用域链和声明提前
在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的(也就是我们不能在代码段外直接访问代码段内声明的变量),我们称之为块级作用域,然而,不同于 ...
- javascript链式调用实现方式总结
方法链一般适合对一个对象进行连续操作(集中在一句代码).一定程度上可以减少代码量,缺点是它占用了函数的返回值. 一.方法体内返回对象实例自身(this) function ClassA(){ this ...
- Javscript的函数链式调用基础篇
我们都很熟悉jQuery了,只能jQuery中一种非常牛逼的写法叫链式操作: $('#div').css('background','#ccc').removeClass('box').stop(). ...
随机推荐
- matlab中textread
今天打算跑下程序,突然发现,真的很烂,不会读入数据,简单的Iris.txt一上午都没读进去,在此对matlab中的textread函数做下总结,textscan函数待续. 本文主要内容引自http:/ ...
- Android权限列表permission说明
网络上不乏android权限列表,但是很少有将列表和使用方法放在一起的,所以特此总结一下 需要在AndroidManifest.xml中定义相应的权限(以获取internet访问权限为例),如下: & ...
- LeetCode 笔记26 Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- openMP的一点使用经验【非原创】
按照百科上说的,针对于openmp的编程,最简单的就是在开头加个#include<omp.h>,然后在后面的for上加一行#pragma omp parallel for即可,下面的是较为 ...
- HoloLens开发手记 - Unity之摄像头篇
当你穿戴好HoloLens后,你就会处在全息应用世界的中心.当你的项目开启了"Virtual Reality Support"选项并选中了"Windows Hologra ...
- [1015][JSOI2008]星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2124 Solved: 909[Submit] ...
- 深入理解C#泛型
前面两篇文章介绍了C#泛型的基本知识和特性,下面我们看看泛型是怎么工作的,了解一下泛型内部机制. 泛型内部机制 泛型拥有类型参数,通过类型参数可以提供"参数化"的类型,事实上,泛型 ...
- Javascript基础系列之(三)数据类型 (类型转化)
所有语言都有类型转化的能力,javascript也不例外,它也为开发者提供了大量的类型转化访法,通过全局函数,可以实现更为复杂的数据类型. var a = 3; var b = a + 3; var ...
- Oracle 索引
索引是建立在数据库表中的某些列的上面,是与表关联的,可提供快速访问数据方式,但会影响增删改的效率:常用类型(按逻辑分类):单列索引和组合索引.唯一索引和非唯一索引. 什么时候要创建索引 (1)在经常需 ...
- iOS开发小技巧--边接受数据边写入文件的两种方法
一.NSFileHanle 使用注意点:在往文件写入数据时,必须创建一个空的文件 指定文件写入的方式 -- 覆盖还是追加 最后记得关闭 <1>代码是在大文件传输的练习中截取的.写入数据之前 ...