一.利用对象收编变量

当我们决定实现某一项功能的时候最简单的其实就是写一个命名函数,然后调用来实现,就像这样:

function checkName(){
//验证姓名
}
function checkEmail(){
//验证邮箱
}
checkEmail();
checkName();

但是这样一来实际上增加了很多的值为函数全局变量,我们这么写会看的更清楚:

var checkName = function(){
//验证姓名
}
var checkEmail = function(){
//验证邮箱
}
checkEmail();
checkName();
 

这样写的功能并没什么问题,但是增加全局变量在多人开发的时候便会产生互相覆盖的问题,并且不易被察觉

最简单的处理方法是,将变量放置在对象里面,通过访问对象属性或方法来执行函数。如下

var CheckObject = {
checkName: function(){
//验证姓名
},
checkEmail:function(){
//验证邮箱
}
}
CheckObject.checkName();
CheckObject.checkEmail();

同样也可以先声明对象,然后往里面添加方法,如下:

var CheckObject = function(){};
CheckObject.checkName = function(){
//验证姓名
}
CheckObject.checkEmail=function(){
//验证邮箱
}

这种先声明对象,再添加方法的方式其实很像我们在angular中声明对象的方式,给$scope这个对象添加方法来实现页面和控制器之间的双向绑定。

二.给对象赋予(复制,实例化,链式调用等)功能

当我们创建完方法后还希望这些方法可以重复利用,也就是当我们复制一份(new)对象之后还能继续使用我们之前创建的方法,所以我们需要对对象进一步进行处理。

复制

如果我们只是单纯想要复制对象的方法,我们可以将方法放置在一个函数对象里面,如下:

var CheckObject = function(){
return {
checkName:function(){
//验证姓名
},
checkEmail:function(){
//验证邮箱
}
}
}

我们可以在很多地方看到函数以这样的方式书写,其实它的目的是每次调用函数都会返回一个新的对象,不会造成相互影响,调用的时候可以这样:

var a = CheckObject();
a.checkName();

这个函数对象已经实现了复制功能,但是我们每次调用时候的a都是创建出来的新对象,跟原函数对象没有任何关系,并且按照习惯我们在创建新对象的时候通常使用的是new方法,所以我们还需要在修改一下,如下:

var CheckObject = function(){
this.checkEmail=function(){
//验证姓名
},
this.checkEmail = function(){
//验证邮箱 }
}

像这样的对象就可以看做是类,所有的方法都是创建再对象上面,调用的时候我们可以使用new关键字来创建,如下:(这种用类创建对象的方法也叫作对类实例化)

var a = new CheckObject();
a.checkEmail();

在这个对象里面,我们将所有的方法通过this来定义,所以使用new实例化的时候,实际上会将类上面this的属性进行复制,这样实际上每个人调用的对象使用的都是一套新的方法。为了减少这种不必要的消耗,我们可以将方法定义在原型上,这样每次创建出来的对象实际上用的是同一套方法,如下:

var CheckObject = function(){};
CheckObject.prototype.checkName = function(){};
CheckObject.prototype.checkEmail = function(){};

或者可以这么写:

var CheckObject = function(){};
CheckObject.prototype = {
checkName:function(){},
checkEmail:function(){}
};

这两种方式都是在原型上创建方法,不过不能一起用,否则会相互覆盖。使用这种方式定义类的时候调用的方法需要变化一下:

var a = new CheckObject();
a.checkName();
a.checkEmail();

链式调用:

当我们调用的时候就会方法如上,每次都要把创建的方法写一遍。我们要实现像jquery那样的链式调用的话就要给每个方法返回当前的对象,如下:

var CheckObject = function(){};
CheckObject.prototype = {
checkName:function(){ return this;},
checkEmail:function(){return this;}
};

调用的时候可以这样:

var a = new CheckObject();
a.checkName().checkEmail()

三. 对js原生对象的扩展

其实这些方法在prototype.js里面都已经用到过了,比如我们要对原生对象(js内置的对象类,如Function,Array,Object等)进行扩展,我们可以抽象出一个统一的添加方法(不能直接在原生对象上面进行添加方法,那样会污染原生对象):

Function.prototype.addMethod = function (name, fn){
this[name]=fn;
return this;
}

添加方法可以这样:(使用返回当前对象的方法来实现链式调用)

var method = new Function();
methods.addMethod('checkName', function(){
return this;
}).addMethod('checkEmail', function(){
return this;
});

调用方法可以这样

methods.checkName().checkEmail();

当然我们如果要使用面向对象的方法来使用js的话,就需要习惯使用类式的调用方法

var method = function(){};
methods.addMethod('checkName', function(){}).addMethod('checkEmail', function(){});
var m=new Methods();
m.checkName();

关于js对象的基础使用方法-《javascript设计模式》读书笔记的更多相关文章

  1. JavaScript设计模式:读书笔记(未完)

    该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...

  2. JavaScript设计模式 -- 读书笔记

    JavaScript设计模式 一. 设计模式 一个模式就是一个可重用的方案: 有效的解决方法.易重用.善于表达该解决方案: 未通过"模式特性"测试的模式称为模式原型: 三规则:适用 ...

  3. JavaScript设计模式读书笔记之一:接口

    接口 在JavaScrip中模仿接口 用注释描述接口 用属性检查模仿接口 用鸭式辨型模仿接口 依赖于接口的设计模式 工厂模式 组合模式 装饰者模式 命令模式 接口 在JavaScrip中模仿接口 用注 ...

  4. 《你不知道的javascript》读书笔记2

    概述 放假读完了<你不知道的javascript>上篇,学到了很多东西,记录下来,供以后开发时参考,相信对其他人也有用. 这篇笔记是这本书的下半部分,上半部分请见<你不知道的java ...

  5. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  6. JS对象 数组排序sort() sort()方法使数组中的元素按照一定的顺序排列。 语法: arrayObject.sort(方法函数)

    数组排序sort() sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码 ...

  7. JS对象 数组连接 concat() 方法用于连接两个或多个数组。此方法返回一个新数组,不改变原来的数组。 语法 arrayObject.concat(array1,array2,.arrayN)

    concat() 方法用于连接两个或多个数组.此方法返回一个新数组,不改变原来的数组. 语法 arrayObject.concat(array1,array2,...,arrayN) 参数说明: 注意 ...

  8. JS对象 返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数 一小时为:60*60*1000

    返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数,计算从 1970 年 1 月 1 日零时到日期对象所指的日期的毫秒数. 如果将目前日期对象的时间推迟1小时,代码如下: &l ...

  9. 《javascript设计模式》笔记之第六章:方法的链式调用

    这一章要实现的就是jQuery的那种链式调用,例子: $(this).setStyle('color', 'green').show(); 一:调用链的结构: 首先我们来看一下最简单的$()函数的实现 ...

随机推荐

  1. CSU-2172 买一送一

    CSU-2172 买一送一 Description ICPCCamp 有 n 个商店,用 1, 2, -, n 编号.对于任意 i > 1,有从商店 \(p_i\) 到 i 的单向道路. 同时, ...

  2. Android App程序结构

    先看结构图: ====================================== 1.   /src   源码目录,不解释. 2.  /gen   gen目录是ADT 自动生成的代码所在位置 ...

  3. c++ 中double与string之间的转换,char *

    运行代码为 /* * main.cpp * * Created on: Apr 7, 2016 * Author: lizhen */ #include <iostream> //#inc ...

  4. maven学习(十三)——eclipse整合maven插件

    一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenProject/Maven2EclipsePlugin

  5. git 远程仓库回滚

    git branch backup #创建备份分支 git push origin backup:backup #push到远程 git reset --hard commit_id #本地分支回滚 ...

  6. Nginx概述与安装

    什么是Nginx 一款服务器软件,类似于Apache.Tomcat Nginx还是一款HTTP和反向代理服务器,同时也是一个代理邮件服务器.除了实现网站发布的功能外,还可以提供负载均衡. 所谓负载均衡 ...

  7. spring+xml集成测试(准备数据和验证项的外部文件化)

    Spring的集成测试 单位测试和集成测试,我想大家都做过,一般情况下,一般逻辑且不需要操作数据库的情况比较适合于单位测试了.而对于一个数据库应用来说,集成测试可能比单元测试更重要,你可以想象,一个互 ...

  8. linux系统初始化——busybox的inittab文件格式说明

    busybox的inittab文件格式说明 要写自己的inittab,需要理解busybox的inittab文件格式. busybox的inittab文件与通常的inittab不同,它没有runlev ...

  9. display:table布局总结

    1. table布局方式 2. table布局实际应用 效果: 代码: <!DOCTYPE html> <html lang="en"> <head& ...

  10. redis学习(五)事务

    事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. 1.事务基本命令: multi:标记一个事务块的开始 exec:执行所 ...