JavaScript创建对象的几种方式对比

431 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

JavaScript本身是一个自由度很高的语言,面向过程编程,面向对象编程可以按照自己心意去开发,本质还是一个面向过程编程的语言,但如果引入适当的库或者自己定义好一些工具函数等,完成可以实现一个面向对象变成的开发方式。

这里简单对比下几种创建对象的方式。

工厂模式

顾名思义,比较固化的一种方式,但是胜在简单轻便

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

缺点: 对象无法识别,都指向一个原型

构造函数模式

在es6中可以等同于一个父类

function Person(name){
  this.name = name;
  this.getName = function(){
  console.log(this.name)
  }
}
var person1 = new Person('kevin')

优点:实例可以识别为一个特定的类型

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

构造函数模式优化

function Person(name){
  this.name = name;
  this.getName = getName
}
function getName(){
  console.log(this.name)
}
var person1 = new Person('kevin')

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

缺点:违背了封装的初衷

原型模式

function Person(name){}

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

优点:可以通过constructor属性找到所属构造函数

缺点:1.所有的属性和方法都共享,2.不能初始化参数

组合模式(构造函数模式+原型模式)

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

优点:该共享的共享,该私有的私有,使用最广泛的方式

缺点:分开写,不是最佳封装