JS设计模式——3.封装与信息隐藏
2014-03-05 11:31
387 查看
封装、信息隐藏与接口的关系
信息隐藏是目的,封装是手段。接口提供了一份记载着可供公共访问的方法的契约。它定义了两个对象间可以具有的关系。只要接口不变,这个关系的双方都是可以替换的。
一个理想的软件系统应该为所有类定义接口。
创建对象的基本模式
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基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
- JS 设计模式--以闭包的方式封装
- js原生设计模式——7原型模式之真正的原型模式——对象复制封装
- js设计模式-封装
- js设计模式之迭代器模式学习笔记--封装简单的数组迭代器
- js原生设计模式——9外观模式封装
- javascript 设计模式 读书笔记 封装和信息隐藏
- 【js设计模式笔记---封装】
- js原生设计模式——2面向对象编程之继承—原型继承(类式继承的封装)
- js原生设计模式——9外观模式封装2(小型代码库YJ)
- 【js设计模式笔记---封装】
- 【JS 设计模式 】用单例模式(Singleton)来封装对数据的增删除改查
- js与设计模式----转一个前言
- 【福利】【已送出几本,更新下】囤积书放送(oracle,java web,js,jquery,rcp,android,数据结构设计模式。。。。。)
- js设计模式--单体模式
- js设计模式之命令模式
- js设计模式之模版方法模式的应用
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
- JS设计模式之享元模式