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

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. javascript 异常基本语法

    http://www.w3school.com.cn/js/js_onerror.asp try...catch 的作用是测试代码中的错误.   JavaScript - 捕获错误 当我们在网上冲浪时 ...

  2. jquery tmpl 详解(转)

    动态请求数据来更新页面是现在非常常用的方法,比如博客评论的分页动态加载,微博的滚动加载和定时请求加载等. 这些情况下,动态请求返回的数据一般不是已拼好的 HTML 就是 JSON 或 XML,总之不在 ...

  3. ref与out区别(ref有进有出,而out只出不进)

    ref与out区别(ref有进有出,而out只出不进)   C#基础:ref和out的区别 ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值 ...

  4. python文件输入和输出

    1.1文件对象 文件只是连续的字节序列.数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成.1.2文件内建函数open()和file() 内建函数open()的基本语法是: file_ ...

  5. spring in action 7.2 小结

    1 对于二进制文件上传功能的实现.在spring中使用multipart来处理,处理方式有两种. CommonsMultipartResolver:使用Jakarta Commons FileUplo ...

  6. unity, SkinnedMeshRenderer.bones[i]不能直接赋值

    SkinnedMeshRenderer.bones[i]=xxx,这样写不报错,但也不起作用. 正确的方法是: List<Transform> boneList=new List<T ...

  7. Facebook Oauth2.0 API调用方法

    这些天搞了下Facebook API的东东,在官方网站下弄了一些接口,下面简单的把facebook的调用流程以及常用接口书序一下 :-)  当然在使用facebook api之前要有facebook账 ...

  8. [转]html5调用摄像头实例

    原文:https://blog.csdn.net/binquan_liang/article/details/79489989 最近在学习在做HTML5的项目,看了博客上html5调用摄像头拍照的文章 ...

  9. python中unicode和unicodeescape

    在python中,unicode是内存编码集,一般我们将数据存储到文件时,需要将数据先编码为其他编码集,比如utf-8.gbk等. 读取数据的时候再通过同样的编码集进行解码即可. #python3 & ...

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

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