Javascript中构造函数和工厂函数的区别是什么

  介绍

这期内容当中小编将会给大家带来有关Javascript中构造函数和工厂函数的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

//, class 关键字,ES6新特性   class  ClassCar  {   ,drive  (), {   console.log才能(& # 39;! & # 39;);   ,}   }   const  car1 =, new  ClassCar ();   console.log (car1.drive ());//,构造函数   function  ConstructorCar  (), {}   时间=ConstructorCar.prototype.drive  function  (), {   ,console.log (& # 39; ! & # 39;);   };   const  car2 =, new  ConstructorCar ();   console.log (car2.drive ());//,工厂函数   const  proto =, {   ,drive  (), {   console.log才能(& # 39;! & # 39;);   ,}   };   function  factoryCar  (), {   ,return  Object.create(原型);   }   const  car3 =, factoryCar ();   console.log (car3.drive ());

这些方法都是基于原型的创建,而且都支持在构造时函数中私有变量的实现。换句话来说,这些函数拥有着大部分相同的特性,甚至在很多场景下,他们是等价的。

在Javascript中,每一个函数都能返回一个新的对象。当它不是构造函数或者类的时候,它就被称作工厂函数。

ES6的类其实是构造函数的语法糖(至少现阶段是这样实行的),所以接下来讨论的所有内容都适用于构造函数的也适用于ES6类:

class  Foo  {}   console.log (typeof  Foo),//,函数

<强>构造函数和ES6类的好处

<李>

大部分的书会教你去用类和构造函数

<李>

'这& # 39;是指向新的这个对象的。

<李>

一些人喜欢新关键字的可读性

<李>

也许还会有一些很小的细节方面的差别,但是如果在开发过程中没有问题的话,也不用太担心。

<强>构造函数和ES6类的坏处

1。你需要新关键字

到了ES6,构造函数和类都需要带新关键字。

function  Foo (), {   ,if (!(却;能够instanceof  Foo)), {, return  new  Foo ();,}   }

在ES6中,如果你尝试调用类函数没有新关键字就会抛出一个任务。如果你要个不用新关键字的话,就只能使用工厂函数把它包起来。

2。实例化过程中的细节暴露给了外界API

所有的调用都紧紧的关联到了构造器的实现上,如果你需要自己在构造过程中动一些手脚,那就是一个非常麻烦的事情了。

3。构造器没有遵守开放/封闭法则

因为新关键字的细节处理,构造器违反开放/封闭法则:API应该开放拓展,避免修改。

我曾经质疑过,类和工厂函数是那么的相似,把类函数升级为一个工厂函数也不会有什么影响,不过在JavaScript里面,的确有影响。

如果你开始写着构造函数或者类,但是写着写着,你发现需要工厂函数的灵活性,这个时候你不能简单的就改改简单改改函数一走了之。

不幸的是,你是个JavaScript程序员,构造器改造成工厂函数是一个大手术:

//,原来的实现://,class  Car  {//,,drive  (), {//,,,console.log (& # 39; ! & # 39;);//,,}//,}//,const  AutoMaker =, {, Car };//,工厂函数改变的实现:   const  AutoMaker =, {   ,Car (包),{   return 才能;Object.create (this.bundle(包));   },   ,包:{   ,,保险费:{   ,,drive  (), {   ,,,console.log (& # 39; Vrooom ! & # 39;);   ,,},   ,,,getOptions: function  (), {   ,,,return [& # 39;皮革# 39;,,& # 39;木# 39;,,& # 39;珍珠# 39;];   ,,}   ,,}   ,}   };//,期望中的用法是:   const  newCar =, AutoMaker.Car(& # 39;溢价# 39;);   newCar.drive ();,//, & # 39; Vrooom ! & # 39;//,但是因为他是一个库//,许多地方依然这样用:   const  oldCar =, new  AutoMaker.Car ();//,如此就会导致://,TypeError: Cannot  read  property  & # 39;未定义# 39;的//,undefined  at  new  AutoMaker.Car

在上面例子里面,我们从一个类开始,最后把它改成来一个可以根据特定的原型来创建对象的工厂函数,这样的函数可以广泛应用于接口抽象和特殊需求定制。

4。使用构造器让instanceof有可乘之机

构造函数和工厂函数的不同就是instanceof操作符,很多人使用instanceof来确保自己代码的正确性。但是说实话,这是有很大问题的,建议避免instanceof的使用。

Javascript中构造函数和工厂函数的区别是什么