14. 创建对象的多种方法及优缺点 - cw84973570/Learning-notes GitHub Wiki

https://github.com/mqyqingfeng/Blog/issues/15

工厂模式

function createPerson(name) {
  var obj = new Object();
  obj.name = name;
  obj.sayName = function () {
    console.log(this.name)
  }
  return obj
}

缺点:无法识别对象,方法声明多次

构造函数模式

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

缺点:方法声明多次

原型模式

function Person(name) {
}
Person.prototype = {
  constructor: Person,
  name: 'Kenvin',
  sayName: function () {
    console.log(this.name)
  }
}

缺点:封装性一般,属性共享

组合模式

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

缺点: 封装性一般

动态原型模式

function Person(name) {
  this.name = name;
  if (typeof this.sayName !== 'function') {
    Person.prototype.sayName = function () {
      console.log(this.syaName);
    }
  }
}

完美封装

下面两个模式没记住

寄生构造函数模式

function Person(name) {
  var obj = new Object();
  obj.name = name;
  obj.sayName = function () {
    console.log(this.name)
  }
  return obj
}
var person = new Person('Kenvin')

和工厂模式的区别是创建对象的时候多了个new,结果是一样的,可能是比较好看?按照作者的理解就是寄生在构造函数上的一种方法,返回的对象并不会是构造函数的一个对象,也就是说生成的对象实例是“寄生”在构造函数上的。

稳妥构造函数模式

function person(name) {
  var obj = new Object();
  obj.sayName = function() {
    console.log(name);
  }
  return obj
}

不引用this不用new操作符创建实例,适合使用在一些安全的环境中。