小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
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()
优点:该共享的共享,该私有的私有,使用最广泛的方式
缺点:分开写,不是最佳封装