通常我们不像下面这样声明函数,因为会创建很多全局变量。

function checkName() {
// code
}
function checkEmail() {
// code
}

所以,我们可以用一个对象将变量收编。

var checkObj = {
checkName: function () {
// code
}, checkEmail: function() {
// code
}
} // 调用
checkObj.checkName();
checkObj.checkEmail();

当然,我们也可以先声明一个对象,然后给它添加方法,调用方式同上面一样。

var checkObj = function () {};
checkObj.checkName = function () { 
  // code
}; checkObj.checkEmail = function() {
  // code
};

但是,当别人有需要用我们上面那些方法时就有些麻烦了。因为这个对象不能复制一份,或者说这个对象类在使用new关键字创建对象时,新创建的对象是不能继承这些方法的。

如果只是想简单的复制下对象,我们可以将这些方法放在一个函数对象中,这样每次调用调用checkObj这个函数的时候,就会返回一个新的包含这些方法的对象,如下:

var checkObj = function () {
return {    
    checkName: function () {
      // code
    },
      checkEmail: function() {
// code   
    }
  } 
} // 调用
var obj = checkObj();
obj.checkName();

但是,上述方式并不是一个真正类的创建方式,所以我们将其稍微改造一下:

var CheckObj = function () {
this.checkName = function () {
// code
}; this.checkEmail = function () {
// code
};
}; // 调用
var obj = new CheckObj();
obj.checkName();

然而,这种方式有时候造成的消耗是很奢侈的,因为我们在使用new关键字创建实例的时候,每个实例都会对this上的属性进行复制,因此会造成每个实例都会拥有自己的一套方法,

所以我们有必要改进一下。将这些方法都挂在到原型上,这样每个实例所有的方法就都是同一个了,因为它们都要依赖prototype依次查找,找到的方法都会是同一个,

即CheckObj类的原型对象上,如下:

var CheckObj = function () {};

CheckObj.prototype.checkName = function () {
// code
}; CheckObj.prototype.checkEmail = function () {
// code
}; // 调用
var obj = new CheckObj();
obj.checkName();

这种方式要将protoype写好多遍,可以像下面这样做:

var CheckObj = function () {};

CheckObj.prototype = {
checkName: function () {
// code
}, checkEmail: function () {
// code
};
}; // 调用
var obj = new CheckObj();
obj.checkName();

但使用这种方式要注意,一定不要和前面那种混用,后者为对象原型对用赋值新对象的这种方式如果用在前者为原型对象添加方法这种方式之后,后者将会覆盖前者。

此时,我们每调用一个方法,都要写一遍示例对象(如obj),我们还可以继续改进,在每个方法末尾将当前对象返回,在JavaScript中,当前对象就是this,

所以,我们可以在函数末尾将this返回。

var CheckObj = function () {};

CheckObj.prototype = {
checkName: function () {
// code
return this;
}, checkEmail: function () {
// code
return this;
};
}; // 调用
var obj = new CheckObj();
obj.checkName().checkEmail();

一款JavaScript框架,其实就是里面为我们封装了很多方法,最大的特点就是对源生对象的拓展,比如如果想给每个函数添加一个检测姓名的方法,可以这么做:

Function.prototype.checkName = function () {
// code
}; // 调用
var fn = function () {};
f.checkName();

但这种平时开发中是绝对不允许的,因为这样会污染原生对象Function,那要怎么做呢?

我们可以抽象一个统一添加方法的方法:

Function.prototype.addMethod = function (name, fn) {
this[name] = fn;
}; var methods = function () {};
methods.addMethod('checkName', function () {
console.log('checkName');
}); methods.addMethod('checkEmail', function () {
console.log('checkEmail');
}); methods.checkName();
methods.checkEmail();

同样,我们可以使用链式添加的方式:

Function.prototype.addMethod = function (name, fn) {
this[name] = fn;
return this;
}; var methods = function () {};
methods.addMethod('checkName', function () {
console.log('checkName');
  return this;
}).addMethod('checkEmail', function () {
console.log('checkEmail');
  return this;
}); methods.checkName().checkEmail();

按照上述方式我们使用的是函数调用方式,对于习惯类式调用的我们可以稍微简单改一下:

Function.prototype.addMethod = function (name, fn) {
this.prototype[name] = fn; // 挂载到原型上
return this;
}; var Methods = function () {};
Methods.addMethod('checkName', function () {
console.log('checkName');
return this;
}).addMethod('checkEmail', function () {
console.log('checkEmail');
return this;
}); var m = new Methods();
m.checkName().checkEmail();

JavaScript是不是很灵活呢? *(^_^)*~~~

灵活的javaScript的更多相关文章

  1. Popmotion – 小巧,灵活的 JavaScript 运动引擎

    Popmotion 是一个只有12KB的 JavaScript 运动引擎,可以用来实现动画,物理效果和输入跟踪.原生的DOM支持:CSS,SVG,SVG路径和DOM属性的支持,开箱即用.Popmoti ...

  2. Sortable – 简单灵活的 JavaScript 拖放排序插件

    当需要在网站中添加拖放排序功能的时候,jQuery UI 的排序组件可能是最流行的解决方案.今天给大家介绍另一款简单灵活的 JavaScript 拖放排序插件——Sortable,它使用 HTML5 ...

  3. javaScript设计模式 -- 灵活的javaScript语言

    因为好长时间的懒惰和懈怠,好久没有更新文章了,从现在开始我会按时更新一些自己总结的一些知识,和研究的东西,希望能让大家从我这里学到一点点的知识. 本文参考了张荣铭的javascript设计模式一书,算 ...

  4. javascript设计模式 第一章 灵活的javascript

    javascript 设计模式 第1章 灵活的语言--JavaScript 初级程序员接到一个验证表单功能的任务,需要验证用户名.邮箱.密码等 ** 此文章内容大部分来自 <javascript ...

  5. 我所见过的最简短、最灵活的javascript日期转字符串工具函数

    我们知道javascript的Date对象并没有提供日期格式化函数.将日期对象转换成"2015-7-02 20:35:11"等这样的格式又是项目中非经常常使用的需求.近期在我们项目 ...

  6. 灵活的JavaScript(一)

    自己对JavaScript的原型,继承,闭包,多少也还是了解些,但是平时写的东西都挺简单的,也用不上,所以感觉提升不大.于是乎买了一本<JavaScript设计模式>来提高下自己,这本是百 ...

  7. 设计模式(一) 灵活的javaScript语言

    首先先看几个函数: function checkName () {){}// 验证姓名 function checkEmail() {} // 验证邮箱 function checkPassword( ...

  8. 【总结】浅谈JavaScript中的接口

    一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...

  9. 2016 年 50 个最佳的轻量级 JavaScript 框架和库

    作者:IT程序狮链接:https://zhuanlan.zhihu.com/p/24598210来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 回顾今年已发布的 JS ...

随机推荐

  1. 【转帖】云平台发现服务构建:为什么不使用ZooKeeper

    http://www.chinacloud.cn/show.aspx?id=19979&cid=16 [日期:2015-04-29] 来源:dockerone   作者: [字体:大 中 小] ...

  2. iOS 获取屏幕某个区域的截图-b

    -(void)fullScreenshots{ UIWindow *screenWindow = [[UIApplicationsharedApplication] keyWindow]; UIGra ...

  3. C#:XML操作(简单)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  4. Docker入门二

    容器管理 1.docker create创建一个容器,但容器并没启动,就和我们创建虚拟机一样,创建了虚拟机后没启动 [root@centos-02 ~]# docker create -it cent ...

  5. TCP 三次握手过程详解

    TCP(Transmission Control Protocol) 传输控制协议 TCP:面向连接的,可靠的,基于字节流的传输层通信协议 TCP(传输层)位于IP层(网络层)之上,应用层之下,不同的 ...

  6. Linux两块4TB的数据磁盘创建8TB的Raid0

    分区表MBR与GPT的说明: MBR:主引导记录,是传统的分区机制,应用于绝大多数使用BIOS的PC设备,MBR+BIOS,MBR支持32位和64位系统,支持的分区数量有限,MBR只支持不超过2T的硬 ...

  7. blender, merge顶点

    选择Edit Mode:,和vertex select: 同时选中两个要merge的顶点(同时选中多个顶点:http://www.cnblogs.com/wantnon/p/4526573.html) ...

  8. Informix 配置选项

    下表列出了用于改善数据库性能的附加选项.如果选择在 onconfig 配置文件中进行更改,则需要重新启动 Informix 通用服务器.可以在 Informix 服务器处于联机或脱机状态时编辑 onc ...

  9. 编写每天定时切割Nginx日志的脚本

    自动每天定时切割Nginx日志的脚本,很方便很好用,推荐给大家使用.本脚本也是参考了张宴老师的文章,再次感谢张宴老师.1.创建脚本/usr/local/nginx/sbin/cut_nginx_log ...

  10. 16位结构的CPU,8086给出物理地址的方法

    .16位结构的CPU 概括地讲,16位结构(16位机,字长为16位等常见说法,与16位结构的含义相同)描述了一个CPU具有下面几方面结构特性: 1.运算器一次最多可以处理16位的数据结构 2.寄存器的 ...