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 ...
随机推荐
- vbs习题
练习题: 1.输入3个数,输出其中最大的那个值. Option Explicit Dim intA,intB,intC intA=CInt(InputBox("请输入a:")) i ...
- react-router之代码分离
概念 无需用户下载整个应用之后才能访问访问它.即边访问边下载.因此我们设计一个组件<Bundle>当用户导航到它是来动态加载组件. import loadSomething from 'b ...
- css实现 显示一行文字,超出用...代替
overflow:hidden; white-space:nowrap; text-overflow:ellipsis;
- HttpWebRequest和HttpWebResponse的应用
创建使用类HttpHelper: public class Httpparam { public string UserAgent { get; set; } public string Accept ...
- Java开发Excel POI getPhysicalNumberOfCells 与 getLastCellNum的区别
1.getPhysicalNumberOfCells 与 getLastCellNum的区别 用org.apache.poi的包做excel导入,无意间发明若是excel文件中有空列,空列后面的数据全 ...
- Java导出数据行写入到Excel表格:基于Apache POI
Java导出数据行写入到Excel表格:基于Apache POI import java.io.File; import java.io.FileOutputStream; import org.ap ...
- 2018九省联考(SHOI2018)
听说在退役前还能有去外省的机会QAQ D1 9点T1,T2过拍,感觉自己稳得一批,然后边看T3边幻想AK 事实证明我是多么菜多么无知多么傻逼 想T3时太浮躁,最后也没想出来 T2根本没有想过去怀疑自己 ...
- C/C++语言中让电脑随机的在某个范围中的任一随机数
这是我在笔试中碰见的一题中一部分,这就就记录下来.举例,输出[1,3]中任一随机数. #include<iostream> #include<cstdlib> #include ...
- 洛谷P1602 Sramoc问题 题解报告【同余+bfs】
题目描述 话说员工们整理好了筷子之后,就准备将快餐送出了,但是一看订单,都傻眼了:订单上没有留电话号码,只写了一个sramoc(k,m)函数,这什么东西?什么意思?于是餐厅找来了资深顾问团的成员,YQ ...
- Zookeeper(一) zookeeper基础使用
一.Zookeeper是什么 (安装的是3.4.7) ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现.它提供了简单原始的功能, ...