javascript设计模式3

门户大开式对象

var Book=function(isbn,title,author){
    if (isbn==undefined) throw new Error("不合法");
    this.isbn=isbn;
    this.title=title||'无标题';
    this.author||'无作者';
}
Book.prototype.display=function(){
    ...
};

强化版本

var Book=function(isbn,title,author){
    if (!this.checkIsbn(isbn)) throw new Error("ISBN无效");
    this.isbn=isbn;
    this.title=title||'无标题';
    this.author||'无作者';
}
Book.prototype={
    checkIsbn:function(isbn){
        if (isbn==undefined||typeof isbn!='string') {
            return false;
        }
        isbn=isbn.replace(/-/,'');
        if (isbn.length!=10 &&isbn.length!=13) {
            return false;
        }
        var sum=0;
        if (isbn.length===10) {
            if(!isbn.match(/^\d{9}/)){
                return false;
            }
            for(var i=0;i<9;i++){
                sum +=isbn.charAt(i)*(10-i);
            }
            var checksum=sum%11;
            if(checksum===10)checksum='X';
            if (isbn.charAt(9)!=checksum) {
                return false;
            }
        }
        else{
            if(!isbn.match(/^\d{12}/)){
                return false;
            }
            for(var i=0;i<12;i++){
                sum+=isbn.charAt(i)*((i%2===0)?1:3);
            }
            var checksum=sum%10;
            if(isbn.charAt(12)!=checksum){
                return false;
            }
        }
        return true;
    },
    display:function(){
        ...
    }
};

 更进一步

var Publication=new Interface('Publication',['getIsbn','setIsbn','getTitle','setTitle','getAuthor','setAuthor','display']);
var Book=function(isbn,title,author){
    this.setIsbn(isbn);
    this.setTitle(title);
    this.setAuthor(author);
}
Book.prototype={
    checkIsbn:function(isbn){
        ...
    },
    getIsbn:function(){
        return this.isbn;
    },
    setIsbn:function(isbn){
        if(!this.checkIsbn(isbn)) throw new Error("ISBN不合法");
        this.isbn=isbn;
    },
    getTitle:function(){
        return this.title;
    },
    setTitle:function(title){
        this.title=title||"无标题";
    },
    getAuthor:function(){
        return this.author;
    },
    setAuthor:function(author){
        this.author=author||"无作者";
    },
    display:function(){
        ...
    }
};

 为了防止其他程序员的无意使用,可以在私有方法和属性前加_表明是私有

用闭包实现私用成员

var Book=function(newIsbn,newTitle,newAuthor){
    var isbn,title,author;
    function checkIsbn(isbn){
        ...
    }
    this.getIsbn=function(){
        return isbn;
    };
    this.setIsbn=function(newIsbn){
        if(!checkIsbn(newIsbn)) throw new Error("ISBN不合法");
        isbn=newIsbn;
    };
    this.getTitle=function(){
        return title;
    };
    this.setTitle=function(newTitle){
        title=newTitle||'无标题';
    };
    this.getAuthor=function(){
        return author;
    };
    this.setAuthor=function(newAuthor){
        author=newAuthor||'无作者';
    };
    this.setIsbn(newIsbn);
    this.setTitle(newTitle);
    this.setAuthor(newAuthor);
};
Book.prototype={
    display:function(){
        ...
    }
};

 

posted @ 2015-01-07 22:09  庄昌宽  阅读(146)  评论(0编辑  收藏  举报