JavaScript本身是一个自由度很高的语言,面向过程编程,面向对象编程可以按照自己心意去开发,本质还是一个面向过程编程的语言,但如果引入适当的库或者自己定义好一些工具函数等,完成可以实现一个面向对象变成的开发方式。
这里简单对比下几种创建对象的方式。
工厂模式
顾名思义,比较固化的一种方式,但是胜在简单轻便
functioncreatePerson(name){varo=newObject()o.name=name;o.getName=function(){console.log(this.name)}returno}varperson=createPerson('kevin')
缺点: 对象无法识别,都指向一个原型
构造函数模式
在es6中可以等同于一个父类
functionPerson(name){this.name=name;this.getName=function(){console.log(this.name)}}varperson1=newPerson('kevin')
优点:实例可以识别为一个特定的类型
缺点:每次创建实例时,每个方法都要被创建一次
构造函数模式优化
functionPerson(name){this.name=name;this.getName=getName}functiongetName(){console.log(this.name)}varperson1=newPerson('kevin')
优点:解决了每个方法都要被重新创建的问题
缺点:违背了封装的初衷
原型模式
functionPerson(name){}Person.prototype={constructor:Person,name:'kevin',getName:function(){console.log(this.name)}}varperson1=newPerson()
优点:可以通过constructor属性找到所属构造函数
缺点:1.所有的属性和方法都共享,2.不能初始化参数
组合模式(构造函数模式+原型模式)
functionPerson(name){this.name=name;}Person.prototype={constructor:Person,getName:function(){console.log(this.name);}}varperson1=newPerson()
优点:该共享的共享,该私有的私有,使用最广泛的方式
缺点:分开写,不是最佳封装