JS设计模式——3.封装与信息隐藏
封装、信息隐藏与接口的关系
信息隐藏是目的,封装是手段。
接口提供了一份记载着可供公共访问的方法的契约。它定义了两个对象间可以具有的关系。只要接口不变,这个关系的双方都是可以替换的。
一个理想的软件系统应该为所有类定义接口。
创建对象的基本模式
1.门户大开型
var Publication = new Interface('Publication', ['getIsbn', 'setIsbn',...]); //接口
var Book = function(isbn, title, author){
this.setIsbn(isbn);
this.setTitle(title);
this.setAuthor(author);
};
Book.prototype = {
checkIsbn: function(){...},
getIsbn: function(){return this.isbn,}, //取值器
setIsbn: function(isbn){this.isbn=isbn;}, //赋值器
...
};
接口+门户大开+取值器/赋值器是门户大开型创建对象所能达到的最好效果了。
2.命名规范区别私有成员。
var Publication = new Interface('Publication', ['getIsbn', 'setIsbn',...]); //接口
var Book = function(isbn, title, author){
this.setIsbn(isbn);
this.setTitle(title);
this.setAuthor(author);
};
Book.prototype = {
checkIsbn: function(){...},
getIsbn: function(){return this._isbn,}, //取值器
setIsbn: function(isbn){this._isbn=isbn;}, //赋值器
...
};
没错,就是在变量的名字前面加个_来区别私有变量,这个也是众所周知的一种命名规范。
3.闭包实现私有成员
var Book = function(newIsbn, newTitle, newAuthor){
var isbn, title, author; //私有
function checkIsbn(isbn){} //私有
this.getIsbn = function(){ //特权
return isbn;
};
this.setIsbn = function(newIsbn){ //特权
if(!checkIsbn(ewIsbn)) throw new Error('Book: invalid ISBN.');
isbn = newIsbn;
}
};
Book.prototype = {
display: function(){ //公有
...
};
};
所谓特权方法就是说这个方法既是公用方法缺能够访问私有变量,故此称之为特权方法。
4.静态方法和属性(注意匿名函数是神来一笔)
前面创建对象时的大多数方法和属性所关联的是类的实例,而静态成员所关联的是类本身。每个静态成员只有一份。
var Book = (function(){
var numOfBooks = 0; //private static attribute
function checkIsbn(){...}; //private static method
return function(newIsbn, newTitle, newAuthor){
var isbn, title, author; //private attribute
//privileged methods
this.getIsbn = function(){
return isbn;
};
this.setIsbn = function(){
...
};
numOfBooks ++;
if(numOfBooks > 50){
throw new Error('Book: Only 50 instances of Book can be created.');
}
this.setIsbn(newIsbn);
...
};
})();
//Public static method
Book.convertToTitleCase = function(){
...
};
//Public, non-privileged methods
Book.prototype = {
display: function(){
...
}
};
想想闭包,琢磨一下numOfBooks这个变量,就知道这是怎么一回事了。
常量
在JS中我们可以通过创建只有取值器而没有赋值器的变量来模仿常量。具体的就不给出代码了。
JS设计模式——3.封装与信息隐藏的更多相关文章
- 如何封装JS ----》JS设计模式《------ 封装与信息隐藏
1. 封装与 信息隐藏之间的关系 实质是同一个概念的两种表达,信息隐藏式目的,二封装是借以达到目的的技术方法.封装是对象内部的数据表现形式和实现细节,要想访问封装过额对象中的数据,只有使用自己定义的操 ...
- JavaScript设计模式——前奏(封装和信息隐藏)
前面一篇讲了js设计模式的前奏,包括接口的讲解.. 三:封装和信息隐藏: 信息隐藏用来进行解耦,定义一些私有的数据和方法. 封装是用来实现信息隐藏的技术,通过闭包实现私有数据的定义和使用. 接口在这其 ...
- 《JavaScript设计模式》笔记之第三章:封装和信息隐藏
第三章 创建对象的基本模式 方法一:门户大开型 var Book = function(isbn, title, author) { if(isbn == undefined ) throw ne ...
- 读书笔记:js设计模式
面向过程编程,面向对象编程和函数式编程> 定义一个类方法1:function Anim(){ } Anim.prototype.start = function(){ .. };Anim.pro ...
- JS设计模式(一)
刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ...
- 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发
一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ...
- js设计模式总结1
js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ...
- 【转】第7篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:全自动注册与反射方法分析
作者: 牛A与牛C之间 时间: 2013-12-12 分类: 技术文章 | 2条评论 | 编辑文章 主页 » 技术文章 » 第7篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第4篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:委托回调方法分析
作者: 牛A与牛C之间 时间: 2013-11-18 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第4篇:Xilium CefGlue 关于 CLR Object 与 JS ...
随机推荐
- virtio是啥子
这个山头今天好像要攻占下来了 guest os中的一些特权操作会被hypervhisor给接收,这里一个很重要的认识是:hypervisor是os的os,既然要访问资源,那么就需要经过整机资源的管理者 ...
- SQL的拼接语句在DELPHI中怎么写
SQL 语句的拼接,关键点在于对引号的处理上. 在 delphi 的语法中,使用单引号做字符串的标志符.因此,当遇到 SQL 语句中字符串标识量编写的时候,需要用两个单引号来代替实际的引号. 举例: ...
- zepto中$.proxy()的到底有多强大?
好吧,其实是标题党了,哈哈,只是想总结一下工作中遇到$.proxy()的用法而已. 一.语法: $.proxy()有两种使用语法 1)$.proxy(fn,context),fn是一个函数,conte ...
- hadoop和spark搭建记录
因玩票需要,使用三台搭建spark(192.168.1.10,192.168.1.11,192.168.1.12),又因spark构建在hadoop之上,那么就需要先搭建hadoop.历经一个两个下午 ...
- LiveCD及Casper调研
1.LiveCD原理 LiveCD本质上是ISO 9660/El Torito格式的CD-ROM. 下面对LiveCD涉及的各种技术做了简单的调研. 1.1. CD-ROM CD-ROM是一种光盘存储 ...
- Java判断一个字符串str不为空:方法及时间效率
判断一个字符串str不为空的方法有: 1.str == null; 2.”“.equals(str): 3.str.length <= 0; 4.str.isEmpty(): 注意:length ...
- 2017-2018-2 20165218 实验四《Android开发基础》实验报告
实验三 Android开发基础 课程:java程序设计 姓名:赵冰雨 学号:20165218 指导教师:娄嘉鹏 实验日期:2018.4.14 实验内容: 1.基于Android Studio开发简单的 ...
- 【2016北京集训】crash的游戏
Portal --> broken qwq Description 有个口袋,一开始里面有\(N\)个球,接下来进行\(M\)次操作,每次可以选择往里面放一个球或者从里面拿一个球出来,在这\(M ...
- 前端基础----JavaScript基础
一.JavaScript概述 1,JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEa ...
- Codeforces Round #338 (Div. 2) B dp
B. Longtail Hedgehog time limit per test 3 seconds memory limit per test 256 megabytes input standar ...