JavaScript对象创建模式

1.object构造函数

  • 先创建空object对象,再动态添加属性/方法
  • 适用场景:起始时不确定对象内部数据
  • 存在问题:语句太多
let p = new Object()
p.name = 'Tom'
p.age = 12
p.setName = function(name) {
  this.name = name
}
p.setName("JACK")
console.log(p.name,p.age) //JACK 12

2.对象字面量模式

  • 使用{}创建对象,同时指定属性/方法
  • 适用场景:起始时对象内部数据是确定的
  • 存在问题: 如果创建多个对象,有重复代码
let p = {
  name: 'Tom',
  age: 12,
  setName: function (name) {
    this.name = name
  }
}

3.工厂模式

  • 通过工厂函数动态创建对象并返回
  • 适用场景:需要创建多个对象
  • 存在问题:对象没有一个具体的类型,都是Object类型(所以此种方法较为少用)
  • 工厂函数:返回一个对象的函数
function createPerson(name,age) {
  let obj = {
    name: name,
    age: age,
    setName: function(name) {
      this.name = name
    }
  }
  return obj
}
let p1 = createPerson('Tom',12)
let p2 = createPerson('Jack',13)

4.自定义构造函数模式

  • 自定义构造函数,通过new创建对象
  • 适用场景:解决了工厂模式的问题,需要创建多个类型确定的对象
  • 存在问题:每个对象都有相同的数据,浪费内存(例如p1和p2都是从Person构造函数中产生的,那么它们都共同拥有相同的方法,该方法重复了占用了内存,故最好将其放在原型中)
function Person(name,age) {
  this.name = name
  this.age = age
  this.setName = function(name) {
    this.name = name
  }
}
let p1 = new Person('Tom',12)
p1.setName('Jack')
console.log(p1.name,p1.age) //Jack 12

5.构造函数+原型模式

  • 自定义构造函数,属性在函数中初始化,方法添加在原型上
  • 适用场景:需要创建多个类型确定的对象
function Person(name,age) {
  this.name = name
  this.age = age
}
Person.prototype.setName = function(name) {
  this.name = name
}
let p1 = new Person('Tom',12)

你可能感兴趣的:(JavaScript对象创建模式)