门户大开式对象

  1. var Book=function(isbn,title,author){
  2. if (isbn==undefined) throw new Error("不合法");
  3. this.isbn=isbn;
  4. this.title=title||'无标题';
  5. this.author||'无作者';
  6. }
  7. Book.prototype.display=function(){
  8. ...
  9. };

强化版本

  1. var Book=function(isbn,title,author){
  2. if (!this.checkIsbn(isbn)) throw new Error("ISBN无效");
  3. this.isbn=isbn;
  4. this.title=title||'无标题';
  5. this.author||'无作者';
  6. }
  7. Book.prototype={
  8. checkIsbn:function(isbn){
  9. if (isbn==undefined||typeof isbn!='string') {
  10. return false;
  11. }
  12. isbn=isbn.replace(/-/,'');
  13. if (isbn.length!=10 &&isbn.length!=13) {
  14. return false;
  15. }
  16. var sum=0;
  17. if (isbn.length===10) {
  18. if(!isbn.match(/^\d{9}/)){
  19. return false;
  20. }
  21. for(var i=0;i<9;i++){
  22. sum +=isbn.charAt(i)*(10-i);
  23. }
  24. var checksum=sum%11;
  25. if(checksum===10)checksum='X';
  26. if (isbn.charAt(9)!=checksum) {
  27. return false;
  28. }
  29. }
  30. else{
  31. if(!isbn.match(/^\d{12}/)){
  32. return false;
  33. }
  34. for(var i=0;i<12;i++){
  35. sum+=isbn.charAt(i)*((i%2===0)?1:3);
  36. }
  37. var checksum=sum%10;
  38. if(isbn.charAt(12)!=checksum){
  39. return false;
  40. }
  41. }
  42. return true;
  43. },
  44. display:function(){
  45. ...
  46. }
  47. };

更进一步

  1. var Publication=new Interface('Publication',['getIsbn','setIsbn','getTitle','setTitle','getAuthor','setAuthor','display']);
  2. var Book=function(isbn,title,author){
  3. this.setIsbn(isbn);
  4. this.setTitle(title);
  5. this.setAuthor(author);
  6. }
  7. Book.prototype={
  8. checkIsbn:function(isbn){
  9. ...
  10. },
  11. getIsbn:function(){
  12. return this.isbn;
  13. },
  14. setIsbn:function(isbn){
  15. if(!this.checkIsbn(isbn)) throw new Error("ISBN不合法");
  16. this.isbn=isbn;
  17. },
  18. getTitle:function(){
  19. return this.title;
  20. },
  21. setTitle:function(title){
  22. this.title=title||"无标题";
  23. },
  24. getAuthor:function(){
  25. return this.author;
  26. },
  27. setAuthor:function(author){
  28. this.author=author||"无作者";
  29. },
  30. display:function(){
  31. ...
  32. }
  33. };

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

用闭包实现私用成员

  1. var Book=function(newIsbn,newTitle,newAuthor){
  2. var isbn,title,author;
  3. function checkIsbn(isbn){
  4. ...
  5. }
  6. this.getIsbn=function(){
  7. return isbn;
  8. };
  9. this.setIsbn=function(newIsbn){
  10. if(!checkIsbn(newIsbn)) throw new Error("ISBN不合法");
  11. isbn=newIsbn;
  12. };
  13. this.getTitle=function(){
  14. return title;
  15. };
  16. this.setTitle=function(newTitle){
  17. title=newTitle||'无标题';
  18. };
  19. this.getAuthor=function(){
  20. return author;
  21. };
  22. this.setAuthor=function(newAuthor){
  23. author=newAuthor||'无作者';
  24. };
  25. this.setIsbn(newIsbn);
  26. this.setTitle(newTitle);
  27. this.setAuthor(newAuthor);
  28. };
  29. Book.prototype={
  30. display:function(){
  31. ...
  32. }
  33. };

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. [machine learning] Loss Function view

    [machine learning] Loss Function view 有关Loss Function(LF),只想说,终于写了 一.Loss Function 什么是Loss Function? ...

  2. Unity3D调用第三方SDK(之一)从eclipse到Unity3D 友盟

    原地址:http://www.360doc.com/content/14/0120/14/11670799_346638215.shtml 篇展示在Unity3D中调用友盟SDK的实现方法. 首先附上 ...

  3. hibernate annotation注解 主键ID自增长

    @Id @SequenceGenerator(name="increment") @GeneratedValue(strategy=GenerationType.AUTO, gen ...

  4. Maven打包时囊括本地依赖的jar包

    在开发中,偶尔会遇到一个问题:某些比较冷门的包,maven服务器上没有,而我们又必须用,通常情况下会在项目中建立一个lib文件夹.将这些包copy进去并加入buildpath,开发就可以继续了,如下图 ...

  5. Pig安装及简单使用(pig版本0.13.0,Hadoop版本2.5.0)

    原文地址:http://www.linuxidc.com/Linux/2014-03/99055.htm 我们用MapReduce进行数据分析.当业务比较复杂的时候,使用MapReduce将会是一个很 ...

  6. 李洪强iOS开发之OC[018]对象和方法之间的关系

    // //  main.m //  18 - 对象和方法之间的关系 // //  Created by vic fan on 16/7/14. //  Copyright © 2016年 李洪强. A ...

  7. ENVI5.1安装破解教程

    原文地址:  ENVI5.1安装破解_百度经验 http://jingyan.baidu.com/article/020278118b5ded1bcd9ce57a.html   ENVI5.1_x86 ...

  8. 【转】Java多线程学习

    来源:http://www.cnblogs.com/samzeng/p/3546084.html Java多线程学习总结--线程概述及创建线程的方式(1) 在Java开发中,多线程是很常用的,用得好的 ...

  9. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)4-----Net下的AppDomain编程 [摘录]

    最近在对AppDomain编程时遇到了一个问题,卸载AppDomain后,在内存中还保留它加载的DLL的数据,所以即使卸载掉AppDomain,还是无法更新它加载的DLL.看来只有关闭整个进程来更新D ...

  10. git rebase无法处理的问题

    在进行代码整理的时候,遇到了冲突 现在chucklu_master分支指向这个commit SHA-1: 88fa1ee9263402626d85b5a4362e1b620935953f * remo ...