一.利用对象收编变量

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

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. 所有 Python 程序员必须要学会的「日志」记录。

    本文字数:3840 字 阅读本文大概需要:10 分钟 写在之前 在我们的现实生活中,「日志记录」其实是一件非常重要的事情,比如银行的转账记录,汽车的行车记录仪记录行驶过程中的一切,如果出现了什么问题, ...

  2. docker exec小脚本

    经常要使用docker exec -it containerID bash 进入docker内部进行一些操作,干脆把它写成shell脚本节省时间. # 查看需要操作的容器id $ docker ps ...

  3. xshell 连接redis

    当我们安装好redis 在本地测试启动,存,取都正常,但是无法远程连接redis. 在redis.conf的文件默认配置中有一配置是 bind 127.0.0.1,表示绑定访问该redis的地址只能是 ...

  4. PIC单片机之时钟设置

    PIC单片机之时钟设置 http://blog.csdn.net/superanters/article/details/8541650 内部时钟和外部时钟? PIC单片机有许多型号可以设置成 用外部 ...

  5. 省选算法学习-dp优化-四边形不等式

    嗯......四边形不等式的确长得像个四边形[雾] 我们在dp中,经常见到这样一类状态以及转移方程: 设$dp\left[i\right]\left[j\right]$表示闭区间$\left[i,j\ ...

  6. BZOJ3884 上帝与集合的正确用法 【欧拉定理】

    题目 对于100%的数据,T<=1000,p<=10^7 题解 来捉这道神题 欧拉定理的一般形式: \[a^{m} \equiv a^{m \mod \varphi(p) + [m \ge ...

  7. [暑假集训--数论]poj2262 Goldbach's Conjecture

    In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in whic ...

  8. Django使用js,css等静态文件的时候,出现mime类型问题

    使用adminLTE模板, return render(request, 'AdminLTE/index.html') 的时候报如下错误且页面渲染异常,css没有效果: Resource interp ...

  9. 适配IPhone X的技巧

    #define TabbarHeight ([[UIApplication sharedApplication] statusBarFrame].size.height>20?83:49) // ...

  10. Secure services with TLS ---Docker配置https

    官方文档:https://docs.docker.com/ee/ucp/interlock/usage/tls/