一.利用对象收编变量

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

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. linux实用命令-待补充

    - du 查看目录大小 - du -h 带有单位显示目录信息 - df 查看磁盘大小 - df -h 带有单位显示磁盘信息 - netstat 显示网络状态信息 - 清除僵尸进程 ps -eal | ...

  2. Java和C#中神奇的String

    Java String: String 类适用于描述字符串事物.该类是不可以被继承的.我们主要学习: 1字符串特性.字符串最大的特性:一旦被初始化就不可以被改变.重赋值只是改变了引用. 2字符串操作. ...

  3. 论文笔记《Fully Convolutional Networks for Semantic Segmentation》

    一.Abstract 提出了一种end-to-end的做semantic segmentation的方法,也就是FCN,是我个人觉得非常厉害的一个方法. 二.亮点 1.提出了全卷积网络的概念,将Ale ...

  4. vue2+nodejs+mongodb搭建移动端网站

    从零开始一步步搭建移动端网站,持续更新,github代码如下,因为放了视频文件,下载可能有点慢 https://github.com/lanleilin/myHomepage 前端采用Vue2+vue ...

  5. js面向对象实现切换面板

    js面向对象的特点: 继承(inheritance):对象方法和属性的继承 多态(polymorphism):组件开发 抽象(abstract):抓住核心问题 封装(encapsulation):把功 ...

  6. rpm包安装mysql5.6.*版本

    1.查看是否已经安装Mysql rpm -qa | grep -i mysql #删除已经安装的Mysql程序 rpm -ev *****.rpm 2.检查是否还有残留mysql文件夹 find / ...

  7. JavaScript中in的用法

    JavaScript中的in 操作符是对Object(对象)操作的,并不是针对数组. in 的右边必须是对象变量 例如:var data = {id:1, name:'AAA'};if('name' ...

  8. linux服务器端口netstat

    netstat命令各个参数说明如下: -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的 ...

  9. Codeforces Round #441 Div. 2 A B C D

    题目链接 A. Trip for Meal 题意 三个点之间两两有路径,分别长为\(a,b,c\),现在从第一个点出发,走\(n-1\)条边,问总路径最小值. 思路 记起始点相邻的边为\(a,b\), ...

  10. java基于udp实现键盘录入聊天

    发送端 package demo02; import java.io.IOException; import java.net.DatagramPacket; import java.net.Data ...