js 设计模式 第三章

封装 + 信息隐藏

why?

让你同原始数据解耦和


what?

三种定义对象的方法

1 完全暴露在外的方法(利用传统的,用函数模拟构造函数。因为所有的属性和方法都是公开的public)

   var Book = function(isbn,title,author){

       this.isbn = isbn;

       this.title = title;

       this.author = author;

  }

  Book.prototype.display = function(){this.checkIsbn();....}

  Book.prototype.checkIsbn = function(){}

所有的方法都暴露在外,即使checkIsbn不需要暴露在外。同时,所有的属性也暴露在外。isbn属性,应该在对象创建完后,不能修改。但用这种方法,仍然可用通过对象修改isbn的属性。

var jsbook = new Book('9999','js','MCZ');

jsbook.isbn='8888';


2 利用命名习惯,来说明私有变量和函数。即以‘_'开头,则表示私有的,不应该通过对象直接访问。

但问题也很明显,这种方法不能强制执行


3 利用闭包来实现

var Book = function(isbn,title,author){

    var is,ti,au;

   //privileged methods

    this.setIsbn = function(isbn){is=isbn;}

    this.setTitle = function(title){ti=title;}

    this.setAuthor = function(author){au=author;}

    this.setIsbn(isbn);

    this.setTitle(title);

    this.setAuthor(author);

}

Book.prototype.display = function(){}  //public ,non-privileged methods


优点是实现了信息隐藏。缺点是:每个对象将有一份private 和 privileged method,这将可能非常耗内存;同时,这个模式非常难用于继承,因为子类将不能访问父类的私有属性和方法。


静态属性和方法

静态属性和方法是与类本身进行交互的,与对象无关。静态成员只会在内存中保存一份。

var Book = (function(){
    //private static attributes
    var numOfBooks = 0;
    //private static method
    function checkIsbn(isbn){}
    //return the constructor
    return function(newIsbn,newTitle,newAuthor){
      //private attribute
      var isbn,title,author;
      ...............
      numOfBooks++;
    }
})();
//public static method
Book.convertToTitleCase = function(inputString){}

类的私有、特权成员定义在构造函数中,分别用var 和this。类的静态成员定义在闭包中。


常量

常量是值不会变的变量,在js中通过闭包来实现

var Constants = (function(){
    var a = 100;
    var getA=function(){return a;};
    return {getA:getA};
})();
alert(Constants.getA());



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值