学习JavaScript设计模式——面向对象(一)

面向对象(一)

1. 封装

创建类的方式

  1. 声明一个函数保存在一个变量里
  2. 在这个函数(类)的内部通过对this(函数内部自带的一个变量,用于指向当前这个对象)变量添加属性或者方法来实现对类添加属性或者方法
  let Book = function(id, bookname, price){
     this.id = id
     this.bookname = bookname
     this.price = price
  }
  1. 也可以通过类的原型(类也是一个对象,所以也有原型prototype)上添加属性和方法
    • 一种是一一为原型对象属性赋值
    • 另一种是将一个对象赋值给类的原型对象
    • 不要混用
  Book.prototype.display = function(){
    // 展示这本书
  }
  
  或
  
  Book.prototype = {
    display: function() {}
  }
  

通过this添加的属性和方法同pototype中添加的属性和方法的区别?

  • 通过this添加的属性、方法是在当前对象上添加的,这些属性和方法是该对象自身拥有的

  • prototype中添加继承的属性和方法,因为js是基于原型prototype的语言,每创建一个对象时,都有一个原型pototype用于指向其继承的属性、方法, 这些通过prototype继承的方法并不是对象自身的

  • 每次通过类创建一个新对象时,this指向的属性和方法都会得到相应的创建

  • 通过prototype继承的属性或者方法是每个对象通过prototype访问到,每次通过类创建一个新对象时这些属性和方法不会再次创建

  • 通过prototype的属性和方法是共有属性和方法

var Book = function(id, name, price) {
     // 私有属性
     var num = 1;
     // 私有方法
     function checkId() {
   
     }
     // 特权方法
      this.getName = function() {
        return this.name
      }
      this.getPrice = function() {
        return this.price
      }
      this.setName = function() {
        this.name = name
      }
      this.setPrice = function() {
        this.price = price
      }
      // 对象公有属性
      this.id = id
      // 对象公有方法
      this.copy = function() {}
      // 构造器
      this.setName(name)
      this.setPrice(price)
 }

// 类静态公有属性(对象不能访问)
Book.isChinese = true;
// 类静态公有方法(对象不能访问)
Book.resetTime = function(){
   console.log('new Time')
}
Book.prototype= {
   // 公有属性
   isJSBook: false,
   // 公有方法
   display: function(){}
}
  • constructor 是一个属性

  • 当创建一个函数或对象时,都会为其创建一个原型对象prototype

  • 在prototype 对象中又会像函数中创建this一样创建一个constructor属性 (prototype 在单独 的constructor 里, _ proto里也有constructor,这个里面是 proto_属性)

  • 那么construcrot属性指向的就是拥有整个原型对象的函数或对像

  • 通过new 关键字创建的对象实质是对新对象this的不断赋值

  • 并将prototype指向类的prototype所指向的对象

  • 但是 类 的构造函数外面通过“.”语法定义的属性方法是不会添加到新创建的对象上去的

  • 要想使用属性和方法,可以在原型prototype上定义

2. 闭包实现封装类

 var Book = (function(){
    // 静态私有变量
    var bookNum = 0
    // 静态私有方法
    function checkBook(name) {}
    // 创建类
    function _book(newId, newName, newPrice){
        // 私有变量
        var name, price;
        // 私有方法
        function checkID(id){}
        // 特权方法
        this.getName = function(){};
        this.getPrice = function(){};
        this.setName = function(name){
            this.name = name
        }
        this.setPrice = function(price){
           this.price = price
        }
        // 公有属性
        this.id = newId
        // 公有方法
        this.copy = function() {}
        bookNum++
        if(bookNum>100){
            throw new Error('我们仅出100本书。')
        }
        // 构造器
        this.setName(name);
        this.setPrice(price);
    }
    // 构建原型
    _book.prototype = {
        // 静态公有属性
        isJSBook: false,
        // 静态公有方法
        display: function() {}
    }
    // 返回类
    return _book;
 })()

创建对象的安全模式

 // 图书安全类
 var Book = function (title, time, type) {
 // 判断执行过程中 this 是否是当前这个对象(如果是说明是new创建的)
 if(this instanceof Book) {
     this.title = title
     this.time = time
     this.type = type
 } else {
     // 否则重新创建这个对象
    return new Book('JavaScript', '2014', 'js')
 }

你可能感兴趣的:(学习JavaScript设计模式——面向对象(一))