JS设计模式——3.封装与信息隐藏

本文深入探讨了封装、信息隐藏与接口在构建高效软件系统中的关键作用,阐述了如何通过接口定义对象间的关系,并介绍了创建对象的四种模式:门户大开型、命名规范区别私有成员、闭包实现私有成员和静态方法与属性。文章还讨论了常量的实现方式,以及在JavaScript中模仿常量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

封装、信息隐藏与接口的关系

信息隐藏是目的,封装是手段。

接口提供了一份记载着可供公共访问的方法的契约。它定义了两个对象间可以具有的关系。只要接口不变,这个关系的双方都是可以替换的。

一个理想的软件系统应该为所有类定义接口。

创建对象的基本模式

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中我们可以通过创建只有取值器而没有赋值器的变量来模仿常量。具体的就不给出代码了。

转载于:https://www.cnblogs.com/JChen666/p/3582069.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值