Kwin Huang

不会搞艺术的程序员不是好设计师.

封装

2018-09-17

创建一个类

var Book = function(name, id) {
  this.name = name;
  this.id = id;
}

Book.prototype.showName = function() {
  console.log(this.name);
}
或者
Book.prototype = {
  showName: function() {
    console.log(this.name);
  }
}

var book = new Book('javascript红宝书', 1);
book.showName();

平常我们说的一些对象的公有属性,私有属性,公有方法,私有方法,特权方法,静态属性,静态方法这么多的名词到底是什么

var Book = function(name, id) {
  // 私有属性  只能在函数内部自己访问, 外界访问不到
  var num = 1;

  // 私有方法  只能在函数内部自己访问, 外界访问不到
  function checkId() {};

  // 特权方法  在外界能访问到类的私有属性和私有方法的方法
  this.getName = function() {};
  this.getId = function() {};
  this.setName = function() {};
  this.setId = function() {};

  // 公有属性  new关键字实例化的对象上绑定的属性
  this.name = name;
  this.id = id;

  // 公有方法  new关键字实例化的对象上绑定的方法
  this.show = function() {};

  // 构造器
  this.setName(name);
  this.setId(id);
}

// 静态属性  new实例化出来的对象不能访问
Book.isChinese = true; 

// 静态方法  new实例化出来的对象不能访问
Book.resetTime = function() {
  console.log('resetTime');
}

Book.prototype = {
  // 公有属性
  isJsBook: true,
  // 公有方法
  showName: function() {}
}

var book = new Book('javascript红宝书', 1);
book.showName();

这样一个Book 的类就创建好了, 但是从开始定义Book = function...开始到最后感觉整个类的相关的定义是分开的, 不是一个整体, 所以一般就用闭包来将代码封装到一块:

var Book = (function (){
  // 静态私有属性
  var bookNum = 0;
  // 静态私有方法
  function checkBook(name) {};
  // 创建类
  function _book(name, id) {
    // 私有变量
    var name, id;
    // 私有方法
    function checkId(id) {};
    // 特权方法
    this.getName = function() {};
    this.getId = function() {};
    this.setName = function() {};
    this.setId = function() {};
    // 公有属性
    this.name = name;
    this.id = id;
    // 公有方法
    this.show = function() {};
  }
  // 构造原型
  _book.prototype = {
    // 静态公有属性
    isJSBook: false,
    // 静态公有方法
    display: function() {} 
  };
  // 返回类
  return _book;
})()