一.利用对象收编变量

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

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. C++ 编程笔记

    图片有点大,请耐心下载!

  2. 【bzoj3435】[Wc2014]紫荆花之恋 替罪点分树套SBT

    题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是一个带权树.每 ...

  3. 【bzoj4836】[Lydsy2017年4月月赛]二元运算 分治+FFT

    题目描述 定义二元运算 opt 满足   现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c  你需要求出有多少对 (i, j) 使得 a_ ...

  4. [NOI2014][bzoj3670] 动物园 [kmp+next数组应用]

    题面 传送门 思路 首先,这题最好的一个地方,在于它给出的关于$next$的讲解实在是妙极......甚至可以说我的kmp是过了这道题以后才脱胎换骨的 然后是正文: 如何求$num$数组? 这道题的输 ...

  5. 三叉神经树 ( neuron )

    三叉神经树 ( neuron ) 题目描述 计算神经学作为新兴的交叉学科近些年来一直是学术界的热点.一种叫做SHOI 的神经组织因为其和近日发现的化合物SHTSC 的密切联系引起了人们的极大关注. S ...

  6. 【11】vue router 之导航钩子

    导航钩子 vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消.有多种方式可以在路由导航发生时执行钩子:全局的, 单个路由独享的, 或者组件级的.http://www.jiansh ...

  7. Spy++使用方法

    原文转自 http://jingyan.baidu.com/article/3a2f7c2e76584a26aed61174.html 1.Spy++ 是Visual Studio 自带的工具(菜单& ...

  8. shell文本过滤编程(一):grep和正则表达式【转】

    转自:http://blog.csdn.net/shallnet/article/details/38799739 版权声明:本文为博主原创文章,未经博主允许不得转载.如果您觉得文章对您有用,请点击文 ...

  9. UVALive 3517:Feel Good(单调栈 Grade C)

    VJ题目链接 题意: n个数,求区间[l,r] 使得 sum[l,r]*min(a[l],a[l+1],...,a[r]) 最大.若有多种答案,输出区间最短的.若还有多组,输出最先出现的. 思路: 求 ...

  10. poj 2892(二分+树状数组)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7749   Accepted: 3195 D ...