# 设计模式-构造函数

# 基本用法

js没有类的概念,通常认为构造函数是用来实现实例的,通过 new 关键字来调用构造函数创建一个新对象。构造函数内部的 this 引用的是新创建的对象。

function Player(name, age) {
  this.name = name
  this.age = age
  this.output = function () {
    return this.name + ' is ' + this.age + ' years old'
  }
}

var Irving = new Player('Irving', 18)
var Kobe = new Player('Kobe', 18)

console.log(Irving.output())
console.log(Kobe.output())

这是个灰常简单的构造函数,所以问题一下就暴漏了。首先继承就麻烦了,其次 output() 每次创建对象的时候都重新定义了,如果有大批量实例的话,内存开销就很大,所以最好的方法是让 Player 实例共享这个 output() 方法

# 构造函数与原型

function Player(name, age) {
  // 强制使用new
  if (!(this instanceof Player)) {
    return new Player(name, age)
  }
  this.name = name
  this.age = age
}

Player.prototype.output = function () {
    return this.name + ' is ' + this.age + ' years old'
  }

var Irving = new Player('Irving', 18)
var Kobe = new Player('Kobe', 18)

console.log(Irving.output())
console.log(Kobe.output())

# ES6

// 类的声明
class Player {
  constructor(name, age) {
    this.name = name
    this.age = age
  }

  output() {
    return this.name + ' is ' + this.age + ' years old'
  }
}

// 类实例化
let Irving = new Player('Irving', 18)
Irving.output()