我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧!

在通常情况下,我们在js中声明一个方法一般是直接

function MethodName(){
//具体逻辑
}

这样声明当然没问题,但是如我们是在团队中进行开发,这样声明的方法有可能会污染全局变量
这个时候您或许会想函数是变量吗?那么请看下面的例子

var MethodObject={
MethodName:function(){
//具体逻辑
}
}

这个时候我们可以将我们需要实现的函数作为MethodObject对象的方法,这样我们就只有一个对象,可以很大程度的避免污染全局变量
而我们想要调用这些方法也很简单,直接MethodObject.MethodName()就可以了,只是在我们以前的调用函数式前多了一个对象名称
既然我们可以通过".",来使用方法,那么我们也可以创建这个对象,不过我们要先声明一个对象,然后才能给它添加方法。
比如,我们先声明一个对象,当然在JavaScript中函数也是对象

var MethodObject=function(){};

接着我们对这个对象添加方法

MethodObject.MethodName=function(){
//具体逻辑
}

同样的我们也可以通过MethodObject.MethodName()去调用这个方法
但是,我们这样去创建对象有一个问题,如果别人想用我们这个对象里的方法就很麻烦,因为新创建的对象是不能继承我们这些方法的。这个时候我们可以将我们的方法放在一个函数对象中。

var MethodObject=function(){
return{
MethodName:function(){
//具体逻辑
}
}
}

当我们这样创建对象,每次调用这个函数的时候,都会把我们之前写的那个对象返回出来。
这样我们就可以通过下面的示例去创建并调用

var Method=MethodObject();
Method.MethodName();

虽然我们通过创建对象的方法,达到了我们最初的目的,避免污染全局,但是我们现在的写法不是一个真正意义上类的创建方式,而且我们return返回的对象和MethodObject对象无关,所以我们在对这个方式改造一下

var MethodObject=function(){
this.MethodName=function(){
//具体逻辑
}
}

像这样的对象我们就可以看成一个类了,我们可以使用关键字new来创建

var Method=new MethodObject();
Method.MethodName();

不过由于我们是通过this对其进行定义的,所以每一次通过new关键字创建对象,实际上新创建的对象都会对类的this上的属性进行复制,然而有时候这么做对内存的消耗是奢侈的,我们再来改进一下

var MethodObject=function(){};
MethodObject.prototype={
MethodName:function(){
//具体逻辑
}
}

这样我们创建出来的对象所拥有的方法就都是一个了,因为他们都要依赖prototype原型依次寻找,而找到的方法又都是同一个,它们都绑定在MethodObject类的原型上。
同样的我们也是通过new来创建通过"."来调用。

var Method=new MethodObject();
Method.MethodName();

但是,如果我们在对象里添加了多个方法,需要一个个的点出来,看上去不是很美观,我们还可以这么修改

var MethodObject=function(){};
MethodObject.prototype={
MethodName:function(){
//具体逻辑
return this;
},
MethodNameTwo:function(){
//具体逻辑
return this;
}
}

这样我们如果需要使用多个方法就可以通过链式直接点出来

var Method=new MethodObject();
Method.MethodName().MethodNameTwo();

这样我们就达到了我们最初的目的避免污染全局。
最后结合今天所分享的知识,再给大家带来统一添加方法的功能,也能实现避免污染全局的目的
首先我们向原声对象Function中添加一个添加方法的功能方法

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

接着我们创建一个对象,并像其中添加方法

var Methods=function(){};
Methods.addMethod('MethodName',function(){
//具体逻辑
}).addMethod('MethodNameTwo',function(){
//具体逻辑
});

同样的我们需要通过new来创建对象再调用它

var method=new Methods();
method.MethodName();

好了以上就是本次分享的全部内容,本次示例参考自JavaScript设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

再起航,我的学习笔记之JavaScript设计模式01的更多相关文章

  1. 再起航,我的学习笔记之JavaScript设计模式02

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...

  2. 再起航,我的学习笔记之JavaScript设计模式03

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 上一 ...

  3. 再起航,我的学习笔记之JavaScript设计模式04

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 上回 ...

  4. 再起航,我的学习笔记之JavaScript设计模式05(简单工程模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...

  5. 再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)

    上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式. 工厂方法模式 工厂方法模式(Factory Method):通过对产品类的抽象使其创建 ...

  6. 再起航,我的学习笔记之JavaScript设计模式05(简单工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...

  7. 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  8. 再起航,我的学习笔记之JavaScript设计模式08(建造者模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...

  9. 再起航,我的学习笔记之JavaScript设计模式09(原型模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...

随机推荐

  1. Vulkan Tutorial 18 重构交换链

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 现在我们已经成功的在屏幕上绘制出三角形,但是在某些情况下, ...

  2. RSA加密通信小结(四)--RSA加解密的实际操作与流程小结

    在上一篇文章中,我们已经将密钥的生成方法和流程,归纳总结.而本篇主要是讲如何利用密钥进行加解密. 首先,在上一篇文章中的我们生成了很多密钥,证书等等. 在上述生成的文件中,接收服务端加密报文:pkcs ...

  3. 东北育才 DAY2组合数取mod (comb)

    组合数取模(comb) [问题描述] 计算C(m,n)mod 9901的值 [输入格式] 从文件comb.in中输入数据. 输入的第一行包含两个整数,m和n [输出格式] 输出到文件comb.out中 ...

  4. ADO.NET中的五大对象

    Connection connection 对象主要是开启程序和数据库之间的连接.没有利用连接对象将数据库打开,是无法从数据库中取到数据的.这个物件是ADO.NET的最底层,我们可以自己产生这个对象, ...

  5. 实现一个javascript手势库 -- base-gesture.js

    现在移动端这么普及呢,我们在手机上可以操作更多了.对于网页来说实现一些丰富的操作感觉也是非常有必要的,对吧(如果你仅仅需要click,,那就当我没说咯...)~~比如实现上下,左右滑动,点击之类的,加 ...

  6. validateform正则表达式 datatype验证数字

    正则表达式验证正数负数 浮点数/^\-?[0-9]+(.[0-9]+)?$/ datatype="/^\-?[0-9]+(.[0-9]+)?$/"

  7. laydate时间插件更换皮肤

    <script> ;!function(){ laydate.skin('molv'); laydate({ elem: '#demo' }) }();</script>

  8. Http批量异步发送和数据保存

    先说需求. 有个服务程序定时扫描指定文件夹下一个所有文件,文件包含了多个用户(客户)信息及对应的http发送地址和发送数据.现在该服务程序需要提取这些用户信息,然后批量进行发送:发送完后需要将http ...

  9. angular自动化测试--protractor

    前戏 面向模型编程: 测试驱动开发: 先保障交互逻辑,再调整细节.---by 雪狼. 为什么要自动化测试? 1,提高产出质量. 2,减少重构时的痛.反正我最近重构多了,痛苦经历多了. 3,便于新人接手 ...

  10. ReactNative开发工具有这一篇足矣

    ReactNative系列文章: 1.<逻辑性最强的React Native环境搭建与调试> 2.<ReactNative开发工具有这一篇足矣> 正文 React Native ...