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 ...
随机推荐
- 分享几个IP获取地理位置的API接口(最全面的了)
转载;https://cloud.tencent.com/developer/article/1152362 全网首发,最全的IP接口,不服来辩!博主找了几个小时的资料,又手动抓取到了几个接口补充进来 ...
- 简单的 php 防注入、防跨站 函数
/** * 简单的 php 防注入.防跨站 函数 * @return String */ function fn_safe($str_string) { //直接剔除 $_arr_dangerChar ...
- Docker 入门 到部署Web 程序- (阿里面试常用的docker命令和优点)
最近阿里的面试官问我Docker是做什么用的,我记得之前360和美团,京东的都问过,但是一直没时间看,最近有时间了,系统的学习了一下Docker,在此做一下记录,方便各位看官学习交流 一.Docker ...
- 单源最短路径spfa模板(pascal)洛谷P3371
题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...
- 测试开发面试的Linux面试题总结之一:vim使用方法
现在做测试没有说不用到linux,大部分公司都会涉及到,作为测试经常使用linux最常见手段就是查看日志,帮助开发定位问题,这是目前最常见的测试当中使用linux方法,今天就讲一讲vim文本编辑器的使 ...
- 安装lighttpd
依赖包: zlib,pcre,cronolog,bzip2, 1: 将lighttpd的原码包.以土豆现用lighttpd配置文件为基础的lighttpd.conf文件.日志轮循工具cronolog ...
- git push要输入密码问题
git push突然每次都要输入密码了,这个问题困扰了两天,要无密码push,要保证两点. 1. git clone的url一定得是git开头的,不能是https开头的,这个容易被忽略,github ...
- 【agc017E】Jigsaw
Portal -->agc017 Description 给你\(n\)块积木,每块积木由三个矩形组成,中间的矩形最高高度为\(h\),左边的矩形高度为\(a_i\)离底边高度为\(c_i\), ...
- 洛谷P1195 口袋的天空
口袋的天空 327通过 749提交 题目提供者该用户不存在 标签云端 难度普及+/提高 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 暂时没有讨论 题目背景 小杉坐在教室里,透 ...
- OA项目中的论坛模块设计与实现
1.论坛是什么?论坛与贴吧有什么区别? 简单的说论坛和贴吧都是发表言论和讨论的一个平台. 贴吧是论坛的一个部分. 2.关于论坛模块的需求分析? 首先我们看看论坛的几个设计页面: 这个主要是论坛的版块设 ...