您的位置:首页 > Web前端 > JavaScript

js 设计模式 第三章

2012-10-11 21:39 253 查看
封装 + 信息隐藏

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());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: