《JS设计模式》之封装

面向对象:就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与动作(方法),这个对象我们称之为类

通过this定义的属性或方法是该对象自身拥有的,所以我们每次通过类创建一个新对象时,this指向的属性和方法都会得到相应的创建 ,而通过prototype继承的属性或者方法,是每个对象通过prototype访问到的,所以我们每次通过类创建一个新对象时,这些 属性和方法不会再次创建

方法分类

  • 静态私有方法:不能被外部访问到
  • 静态共有方法:在类外面通过点语法定义的属性及方法,new出来的对象无法访问到,但是通过类可以使用。
  • 特权方法:可以访问到一些私有方法和属性
  • 共有方法:在类的内部通过this定义的方法,new出来的对象可以随意使用。

理解new关键字

通过new关键字创建的对象,实质是对新对象this的不断赋值,并将prototype指向类的prot对象,而类的构造函数外面通过点语法 定义的属性和方法是不会添加到新创建的对象上去的,可以参考这一篇 new 运算原理

闭包:有权访问灵台一个函数作用域中变量的函数,即再一个函数内部创建另外一个函数

  var Book = (function () {
  // 静态私有变量
  var bookNum = 0
  // 静态私有方法
  function checkBook (name) {
    console.log(name)
  }
  function _book (newId, newName, newPrice) {
    // 私有变量
    var name, price;
    // 私有方法
    function checkId (id) {
      console.log(id)
    }
    // 特权方法
    this.getName = function () {
      console.log(this.name)
    }
    this.getPrice = function () {
      console.log(this.price)
    }
    // 公有属性
    this.id = newId
    // 共有方法
    this.copy = function () {
      console.log(111)
    }
  }
  _book.prototype = {
    // 静态共有属性
    idJsBook: false,
    // 静态共有方法
    display: function () {
      console.log(222)
    }
  }
  return _book()
})()

安全模式

这里,因为没有new关键字,也没有返回值,所以自然是undefined

  var Book = function (title, name) {
    this.title = title
    this.name = name
  }
  var book = Book('语文', '小明')
  console.log(book)   // undefined

所谓的安全模式,就是在忘了用new的时候,给你加上

    var Book = function (title, name) {
    if (this instanceof Book) {
      this.title = title
      this.name = name
    } else {
      return new Book(title, name)
    }
  }
  var book = Book('语文', '小明')
  console.log(book)   // Book {title: "语文", name: "小明"}

随机浏览