《javascript设计模式》读书笔记二(封装和隐藏信息)
1.为什么要封装和信息隐藏
做过编程的朋友们知道“耦合”这个词。事实上封装的效果就是为了解耦,让类和类之间没有太多的联系,防止某一天改动某一类的时候,产生“多米骨诺牌效应”。
我们能够把信息隐藏看成目的,把封装看成达到信息隐藏的技术。
通过封装就能够把对象的内部数据表现形式和实现细节进行隐藏。就好比你会看电视,可是你不知道电视的内部结构一样。
可是在javascript中没有不论什么内置的机制。所以我们还需做些处理,相同来模仿封装。
2.创建对象的方法
1)最简单的一种方法就是门户大开型对象。用一个函数来作为其构造器。所谓的门户大开就是他的全部的属性和方法都是公开的。相当于我们经经常使用的keyword“public”。
<span style="font-family:SimSun;font-size:18px;"> <script>
//定义一个book的类,function承担了构造函数的工作
var Book = function (name, title, author) {
this.name = name;//书名
this.title = title;//标题
this.author = author;//作者
}
//实例化一个book1对象
var book1 = new Book("语文");
alert(book1.name);
</script></span>
这是一种最简单的创建对象的方式。可是它还是无法做到隐藏对象内部的信息。想想看我们在其它编程语言中是怎样创建对象的呢?
2)vb.net中创建属性对象
<span style="font-family:SimSun;font-size:18px;">'定义一个Book类
Public Class Book
Dim book As String '书名
Dim title As String '标题
Dim author As String '作者
''' <summary>
''' 得到书名
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Property GetBook() As String
Get
Return book End Get
Set(value As String)
book = value End Set
End Property
''' <summary>
''' 返回title
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Property GetTitle() As String
Get
Return title End Get
Set(value As String)
title = value End Set
End Property ''' <summary>
''' 获取作者
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Property GetAuthor() As String
Get
Return author End Get
Set(value As String)
author = value
End Set
End Property End Class
</span>
3.利用闭包模仿VB.NET构造函数
1)看了上述VB.NET的代码。事实上我们也能够在javascript去模仿实现,还是上述的操作,定义一个Book类。关于这个类有三个属性,假设你仅仅想得到的话,能够仅仅简单的设置一个get方法。为了区分私有和公有成员,能够在方法和属性名称前加下划线来区分。
<span style="font-family:SimSun;font-size:18px;"> </span><pre class="javascript" name="code"><span style="font-family:SimSun;font-size:18px;">//定义一个book的类,function承担了构造函数的工作
var Book = function (name) {
this._name = name;//书名
//通过一个内嵌函数,来实现外部的函数可以訪问到内部的私有变量
this._GetName = function () {
return this._name;
}
this._SetName = function (value) {
this._name=value
}
}
//实例化一个book1对象
var book1 = new Book("语文");
alert(book1._GetName());//正确
book1._SetName("数学");
alert(book1._GetName());//正确
alert(_name);//错误操作
alert("");
</span>
<span style="font-family:SimSun;font-size:18px;">这就是一个简单的闭包,通过内嵌函数来返回外层函数的私有变量,从而即封装了内部函数的私有变量又能够訪问的到。 有关于闭包的知识,能够看我先前的博客。</span>
2)以上的操作还能够通过原型对象的操作来实现。
<span style="font-family:SimSun;font-size:18px;"><script>
//定义一个book的类,function承担了构造函数的工作
var Book = function (name) {
this._name = name;//书名
//通过一个内嵌函数。来实现外部的函数可以訪问到内部的私有变量 }
//通过原型对象来设置訪问对象的私有属性
Book.prototype = {
_GetName: function () {
return this._name;
},
_SetName: function (value) {
this._name = value;
}
}
//实例化一个book1对象
var book1 = new Book("语文");
alert(book1._GetName());//正确
book1._SetName("数学");
alert(book1._GetName());//正确
alert(_name);//错误操作
alert("");
</script></span>
3)两种方法对照
能够看到通过上述两种操作都能够封装不论什么对象的私有属性。话又说回来,这两种操作又有什么不同呢?
这就涉及到有关原型对象的知识,本节仅仅是单纯的实现怎样封装隐藏信息,不会在展开讨论。
至于把全部的方法都创建到原型对象中,就会无论生成对少对象实例。这些方法在内存中仅仅会存在一份,方法都共用。而还有一个则不同,没生成一个对象。没调用一个方法,都会占用一份内存。比方说上述的样例中创建了5个Book对象。用样例一中的_GetName方法的话。每一个对象都会占用一份内存,而用原型对象创建的话。五个Book对象共用一份内存,这就是他们最本质的差别。
假设用原型对象创建的方法,在实例化Book1的时候,运行方法时,先从本对象開始寻找,假设找到则停止,未找到则会转移到原型对象方法中寻找。这也是为何创建的对象能够共享原型对象方法的本质。
demo
function Person(name, sex) { this.name = name; this.sex = sex; } Person.prototype.age = 20; var zhang = new Person("ZhangSan", "man"); console.log(zhang.age); // 20 // 覆盖prototype中的age属性 zhang.age = 19; console.log(zhang.age); // 19 delete zhang.age; // 在删除实例属性age后,此属性值又从prototype中获取 console.log(zhang.age); // 20
4.小结
以上就是在javascript中模仿构造函数创建对象的方法,事实上与其它语言对照来说,很的简单。仅仅只是涉及到了一些“闭包”的知识,假设用过其它语言的话,那么你就会很掌握的。
《javascript设计模式》读书笔记二(封装和隐藏信息)的更多相关文章
- JavaScript设计模式:读书笔记(未完)
该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...
- JavaScript设计模式 -- 读书笔记
JavaScript设计模式 一. 设计模式 一个模式就是一个可重用的方案: 有效的解决方法.易重用.善于表达该解决方案: 未通过"模式特性"测试的模式称为模式原型: 三规则:适用 ...
- JavaScript设计模式读书笔记之一:接口
接口 在JavaScrip中模仿接口 用注释描述接口 用属性检查模仿接口 用鸭式辨型模仿接口 依赖于接口的设计模式 工厂模式 组合模式 装饰者模式 命令模式 接口 在JavaScrip中模仿接口 用注 ...
- 《你不知道的javascript》读书笔记2
概述 放假读完了<你不知道的javascript>上篇,学到了很多东西,记录下来,供以后开发时参考,相信对其他人也有用. 这篇笔记是这本书的下半部分,上半部分请见<你不知道的java ...
- 《编写可维护的javascript》读书笔记(中)——编程实践
上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...
- HeadFirst设计模式读书笔记--目录
HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...
- 《你必须知道的.NET》读书笔记二:小OO有大原则
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...
- Javascript & JQuery读书笔记
Hi All, 分享一下我学JS & JQuery的读书笔记: JS的3个不足:复杂的文档对象模型(DOM),不一致的浏览器的实现和便捷的开发,调试工具的缺乏. Jquery的选择器 a. 基 ...
- Head First 设计模式读书笔记(1)-策略模式
一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...
随机推荐
- axure使用经验
泛化不常用======伸展也是拉动原件收缩也是拉动原件====== 动态模板相互影响(有的时候会出现这个问题,只需要设置两者的高度,不让两者有包含关系(一点点可以有):====== 实现高级菜单栏(同 ...
- CPP-基础:快速排序
快速排序(Quicksort)是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分 ...
- 暑假集训 || 区间DP
区间DP 经典石子合并问题V1 复杂度 On3 int a[SZ], sum[SZ], f[SZ][SZ]; int main() { int n; scanf("%d", ...
- PHP21 MVC
学习目标 MVC设计模式 单一入口机制 MVC的实现 MVC设计模式 Model(模型) 是应用程序中用于处理应用程序数据逻辑的部分.通常模型对象负责在数据库中存取数据. View(视图) 是应用程序 ...
- MyBatis的动态sql小练习,小回顾
关键字if+trim trim可以去除多余的关键字,是where和set的组合 trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码: <trim prefix=& ...
- java 自动拆箱 自动装箱
自动装箱的定义就是 基本数据类型赋值给包装类型, 拆箱则相反. Integer integer = 122; // 自动装箱 int num = integer; //自动拆箱 想看一下源码是怎么 ...
- Vijos 1308 埃及分数(迭代加深搜索)
题意: 输入a.b, 求a/b 可以由多少个埃及分数组成. 埃及分数是形如1/a , a是自然数的分数. 如2/3 = 1/2 + 1/6, 但埃及分数中不允许有相同的 ,如不可以2/3 = 1/3 ...
- Spring入门(1)——搭建简单的环境
步骤: 1.下载spring框架开发包. 2.创建web项目并引入开发包. 3.创建java接口和相应的实现类. 4.编写spring的配置文件. 5.编写 测试类,并进行测试. 1.下载spring ...
- 【三种负载均衡器的优缺点】LVS Nginx HAProxy
搭建负载均衡高可用环境相对简单,主要是要理解其中原理.此文描述了三种负载均衡器的优缺点,以便在实际的生产应用中,按需求取舍. 目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LV ...
- IntrospectorCleanupListener监听器防止内存溢出
<listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</ ...