# JS中创建对象的多种方式及优缺点

# 工厂模式

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

var person = createPerson('Tom')

缺点:对象无法识别,因为所有的实例都指向一个原型

# 构造函数模式

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

var person = new Person('Tom')

优点:实例可以识别为一个特定的类型
缺点:每次创建实例时,每个方法都要被创建一次

# 构造函数模式1

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

function getName() {
  return this.name
}

var person = new Person('Tom')

优点:解决了每个方法都要被创建一次的问题
缺点:封装性有点差。。。。

# 原型模式

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

var person = new Person()

优点:方法不会重复创建
缺点:所有的属性和方法都是共享的;不能初始化参数

# 原型模式1

function Person(name) {}
Person.prototype = {
  name: 'Tom',
  getName: function() {
    return this.name
  }
}
var person = new Person()

优点:增强了封装性
缺点:重写了原型,丢失了constructor属性

# 原型模式2

function Person(name) {}

Person.prototype = {
  constructor: Person,
  name: 'kevin',
  getName: function () {
    return this.name
  }
}
var person = new Person()

优点:实例可以通过constructor属性找到所属的构造函数
缺点:继承了原型模式的缺点

# 组合模式

构造函数模式与原型模式结合

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

Person.prototype = {
  constructor: Person,
  getName: function () {
    return this.name
  }
}

var person = new Person()

优点:该共享的共享,该私有的私有,使用最广泛的方式
缺点:更好的封装性

# 动态原型模式

Last Updated: 6/4/2021, 10:15:57 AM