再起航,我的学习笔记之JavaScript设计模式01
我的学习笔记是根据我的学习情况来定期更新的,预计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的更多相关文章
- 再起航,我的学习笔记之JavaScript设计模式02
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...
- 再起航,我的学习笔记之JavaScript设计模式03
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 上一 ...
- 再起航,我的学习笔记之JavaScript设计模式04
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 上回 ...
- 再起航,我的学习笔记之JavaScript设计模式05(简单工程模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...
- 再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)
上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式. 工厂方法模式 工厂方法模式(Factory Method):通过对产品类的抽象使其创建 ...
- 再起航,我的学习笔记之JavaScript设计模式05(简单工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...
- 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- 再起航,我的学习笔记之JavaScript设计模式08(建造者模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...
- 再起航,我的学习笔记之JavaScript设计模式09(原型模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...
随机推荐
- Vulkan Tutorial 18 重构交换链
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 现在我们已经成功的在屏幕上绘制出三角形,但是在某些情况下, ...
- RSA加密通信小结(四)--RSA加解密的实际操作与流程小结
在上一篇文章中,我们已经将密钥的生成方法和流程,归纳总结.而本篇主要是讲如何利用密钥进行加解密. 首先,在上一篇文章中的我们生成了很多密钥,证书等等. 在上述生成的文件中,接收服务端加密报文:pkcs ...
- 东北育才 DAY2组合数取mod (comb)
组合数取模(comb) [问题描述] 计算C(m,n)mod 9901的值 [输入格式] 从文件comb.in中输入数据. 输入的第一行包含两个整数,m和n [输出格式] 输出到文件comb.out中 ...
- ADO.NET中的五大对象
Connection connection 对象主要是开启程序和数据库之间的连接.没有利用连接对象将数据库打开,是无法从数据库中取到数据的.这个物件是ADO.NET的最底层,我们可以自己产生这个对象, ...
- 实现一个javascript手势库 -- base-gesture.js
现在移动端这么普及呢,我们在手机上可以操作更多了.对于网页来说实现一些丰富的操作感觉也是非常有必要的,对吧(如果你仅仅需要click,,那就当我没说咯...)~~比如实现上下,左右滑动,点击之类的,加 ...
- validateform正则表达式 datatype验证数字
正则表达式验证正数负数 浮点数/^\-?[0-9]+(.[0-9]+)?$/ datatype="/^\-?[0-9]+(.[0-9]+)?$/"
- laydate时间插件更换皮肤
<script> ;!function(){ laydate.skin('molv'); laydate({ elem: '#demo' }) }();</script>
- Http批量异步发送和数据保存
先说需求. 有个服务程序定时扫描指定文件夹下一个所有文件,文件包含了多个用户(客户)信息及对应的http发送地址和发送数据.现在该服务程序需要提取这些用户信息,然后批量进行发送:发送完后需要将http ...
- angular自动化测试--protractor
前戏 面向模型编程: 测试驱动开发: 先保障交互逻辑,再调整细节.---by 雪狼. 为什么要自动化测试? 1,提高产出质量. 2,减少重构时的痛.反正我最近重构多了,痛苦经历多了. 3,便于新人接手 ...
- ReactNative开发工具有这一篇足矣
ReactNative系列文章: 1.<逻辑性最强的React Native环境搭建与调试> 2.<ReactNative开发工具有这一篇足矣> 正文 React Native ...