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

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. 推荐10款最常用的Android开发工具

    我们使用各种语言进行开发时,总是会用到各种各样的开发工具.有些开发工具是开发人员的必备品,有些则是为了提高开发效率而用.Android开发同样也会用到多种开发工具,供开发人员设计.创建.测试和发布程序 ...

  2. Linux命令-文件搜索命令:locate

    实际上是在分区表上搜索文件,比find命令速度更快 locate inittab 查找名称包含inittab的所有信息(快速搜索,实际上它是搜索linux资料库,区别于find在某一个磁盘分区或者某一 ...

  3. 使用命令行设置树莓派的wifi网络

    假设你没有登录到经常使用的图形用户界面.这样的方法就适合用来设置树莓派的wifi.尤其是在你没有屏幕或者有线网络,仅使用串口控制线的时候.另外,这样的方法也不须要额外的软件,全部须要的东西都已经包括进 ...

  4. js正则大扫除

    一:exec匹配不到后返回的是null reg = /c{2,}/; str='cainiao'; execReg(reg,str); 结果返回null,c{2,}表示2个以上的c,而cainiao中 ...

  5. php保存快捷方式到桌面

    /** * 保存首页到桌面 */ public function save_shortcut() { $shortcut = "[DEFAULT] BASEURL=http://www.19 ...

  6. libxml2实例

    // libxmlTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #includ ...

  7. tomcat开启https协议

    1.在tomcat的conf/server.xml 中配置 <Connector port="443" protocol="org.apache.coyote.ht ...

  8. Win7-U盘安装出现"We were unable to copy your files. "

    使用Windows 7 USB/DVD Download Tool时,提示We were unable to copy your files. Please check your USB device ...

  9. js中获取event keycode的兼容办法

    window.onkeypress=function(e){ var event = e || window.event, //在ff下event会做为参数传进来,ie下会在window下 keyCo ...

  10. JQuery.getJSON 没反应

    Jquery是一个优秀的Javascrīpt框架,轻量级的js库,它兼容CSS3.jQuery使用户能更方便地处理HTML documents.events.实现动画效果,并且方便地为网站提供AJAX ...