门户大开式对象

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(){
...
}
};

javascript设计模式3的更多相关文章

  1. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  2. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  3. Javascript设计模式学习一

    学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...

  4. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  5. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

  6. javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)

    类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...

  7. 常用的Javascript设计模式

    <parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...

  8. Javascript设计模式(摘译)

    说明: 未完成...更新中.... 一.javascipt设计模式分类 设计模式分类有很多标准,最流行的三种如下 1)  creational  --  主要关注对象创建 Creational des ...

  9. JavaScript设计模式学习笔记

    1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...

  10. JavaScript设计模式:读书笔记(未完)

    该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...

随机推荐

  1. leetcode2 Two Sum II – Input array is sorted

    Two Sum II – Input array is sorted whowhoha@outlook.com Question: Similar to Question [1. Two Sum], ...

  2. sort-based shuffle的核心:org.apache.spark.util.collection.ExternalSorter

    依据Spark 1.4版 在哪里会用到它 ExternalSorter是Spark的sort形式的shuffle实现的关键.SortShuffleWriter使用它,把RDD分区中的数据写入文件. o ...

  3. FZU-1926+KMP

    题意:给定一篇文章和一些句子.询问句子是否在文章中出现. kmp模板题 /* kmp */ #include<stdio.h> #include<string.h> #incl ...

  4. linux top动态查看进程信息

    来源<鸟哥的linux私房菜> top:动态观察程序的变化 [root@linux ~]# top [-d] | top [-bnp] 参数: -d :后面可以接秒数,就是整个程序画面更新 ...

  5. codeforces #305 B Mike and Feet

    跟之前做过的51Nod的移数博弈是一样的QAQ 我们考虑每个数的贡献 定义其左边第一个比他小的数的位置为L 定义其右边第一个比他小的数的位置为R 这个可以用排序+链表 或者 单调队列 搞定 那么对于区 ...

  6. ORA-00911 :无效字符

    ———————————————————————————————————————————————————— 附: 1   ORA-01790:表达式必须具有与对应表达式相同的数据类型 知识解析:SQL ...

  7. Frequent values && Ping pong

    Frequent values 题意是不同颜色区间首尾相接,询问一个区间内同色区间的最长长度. 网上流行的做法,包括翻出来之前POJ的代码也是RMQ做法,对于序列上的每个数,记录该数向左和向右延续的最 ...

  8. node.js模块之fs文件系统

    fs 模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等 POSIX 文件系统操作.与其他模块不同的是,fs 模块中所有的操作都提供了异步的和同步的两个版本, 例如读取文件内 ...

  9. 类似百度文库pdf2swf+flexpaper解决pdf在线阅读的效果

    1:工具准备swftools.exe 下载http://www.swftools.org/download.html 安装至D盘SWFTools提供了一系列将各种文件转成swf的工具:font2swf ...

  10. Android init进程概述

    init进程,其程序位于根文件系统中,在kernle自行启动后,其中的 start_kernel 函数把根文件系统挂载到/目录后,在 rest_init 函数中通过 kernel_thread(ker ...