# 前言

本片主要讲解创建对象各种方式的优缺点,本文更像是笔记,因为红宝书写的太好了。

# 工厂模式

function createPerson(name) {
  var o = new Object()
  o.name = name
  o.getName = function() {
    console.log(this.name)
  }
  return o
}

var person = createPerson('Tom')
  • 缺点:对象无法识别,因为所有的实例都指向一个原型。

# 构造函数模式

function Person(name) {
  this.name = name
  this.getName = function() {
    console.log(this.name)
  }
}

var person = new Person('Tom')
  • 优点:实例可以被归类为一类

  • 缺点:每次创建实例时,每个方法都要被创建一次

# 优化

function Person(name) {
  this.name = name
  this.getName = getName
}

function getName() {
  console.log(this.name)
}

var person = new Person('Tom')

优点:解决了每个方法都要被重新创建的问题

缺点:这叫啥封装...

# 原型模式

function Person(name) {}

Person.prototype.name = 'Tom'
Person.prototype.getName = function() {
	console.log(this.name)
}

var person = new Person()
  • 优点:方法不会被重新创建

  • 缺点:

    • 所有的属性和方法都共享
    • 不能初始化参数

# 优化1

function Person(name) {

}

Person.prototype = {
    name: 'kevin',
    getName: function () {
        console.log(this.name);
    }
};

var person1 = new Person();
  • 优点:封装看起来好一点
  • 缺点:重写了原型,丢失了 constructor

# 优化2

function Person(name) {

}

Person.prototype = {
    constructor: Person,
    name: 'kevin',
    getName: function () {
        console.log(this.name);
    }
};

var person1 = new Person();
  • 优点:实例可以通过 constructor 找回构造函数
  • 缺点:原型模式该有的缺点一个没少

# 组合模式

function Person(name) {
    this.name = name;
}

Person.prototype = {
    constructor: Person,
    getName: function () {
        console.log(this.name);
    }
};

var person1 = new Person();
  • 优点:该共享的共享,该私有的私有,使用最广泛的模式
  • 缺点:封装性看起来看起来差点