js深入研究之神奇的匿名函数类生成方式

<script type="text/javascript">
var Book = (function() {
  
  // 私有静态属性
  var numOfBooks = 0;

  // 私有静态方法
  function checkIsbn(isbn) {
    if(isbn == undefined || typeof isbn != 'string') {
      return false;
    }
    return true;
  }    

  // 返回构造函数
  return function(newIsbn, newTitle, newAuthor) { // implements Publication

    // 私有属性
    var isbn, title, author;

    // 特权方法
    this.getIsbn = function() {
      return isbn;
    };
    this.setIsbn = function(newIsbn) {
      if(!checkIsbn(newIsbn)) throw new Error('Book: Invalid ISBN.');
      isbn = newIsbn;
    };

    this.getTitle = function() {
      return title;
    };
    this.setTitle = function(newTitle) {
      title = newTitle || 'No title specified';
    };

    this.getAuthor = function() {
      return author;
    };
    this.setAuthor = function(newAuthor) {
      author = newAuthor || 'No author specified';
    };

    // 控制对象数目,构造函数
    numOfBooks++; // Keep track of how many Books have been instantiated
                  // with the private static attribute.
    if(numOfBooks > 5) throw new Error('Book: Only 5 instances of Book can be '
        + 'created.');

    this.setIsbn(newIsbn);
    this.setTitle(newTitle);
    this.setAuthor(newAuthor);
  }
})();

// 公有静态方法
Book.convertToTitleCase = function(inputString) {
  alert('convertToTitleCase');
};

// 公有非特权方法
Book.prototype = {
  display: function() {
    alert("isbn:"+this.getIsbn()+" title:"+this.getTitle()+" author:"+this.getAuthor());
  }
};
//var theHobbit = new Book(123, '', 'J. R. R. Tolkein'); // 非字符串抛出异常
var theHobbit = new Book('1990-78sd-1092', '', 'J. R. R. Tolkein'); 
theHobbit.display(); 
//theHobbit.convertToTitleCase(); // Uncaught TypeError: Object #<Object> has no method 'convertToTitleCase'
Book.convertToTitleCase();  // 输出convertToTitleCase

var theHobbit2 = new Book('1990-78sd-1092', '', 'J. R. R. Tolkein'); 
theHobbit2.display(); 

var theHobbit3 = new Book('1990-78sd-1092', '', 'J. R. R. Tolkein'); 
theHobbit3.display(); 

var theHobbit4 = new Book('1990-78sd-1092', '', 'J. R. R. Tolkein'); 
theHobbit4.display(); 

var theHobbit5 = new Book('1990-78sd-1092', '', 'J. R. R. Tolkein'); 
theHobbit5.display(); 

var theHobbit6 = new Book('1990-78sd-1092', '', 'J. R. R. Tolkein'); 
theHobbit6.display(); // Uncaught Error: Book: Only 5 instances of Book can be created. 

</script>

这里已经把js出神入化了,佩服到极致,代码清晰简洁,美观,注释恰到好处。

原文地址:https://www.cnblogs.com/jiqing9006/p/5051766.html