首页 > 语言 > JavaScript > 正文

详解Javascript 中的 class、构造函数、工厂函数

2024-05-06 15:23:25
字体:
来源:转载
供稿:网友

到了ES6时代,我们创建对象的手段又增加了,在不同的场景下我们可以选择不同的方法来建立。现在就主要有三种方法来构建对象,class关键字,构造函数,工厂函数。他们都是创建对象的手段,但是却又有不同的地方,平时开发时,也需要针对这不同来选择。

首先我们来看一下,这三种方法是怎样的

// class 关键字,ES6新特性class ClassCar { drive () {  console.log('Vroom!'); }}const car1 = new ClassCar();console.log(car1.drive());// 构造函数function ConstructorCar () {}ConstructorCar.prototype.drive = function () { console.log('Vroom!');};const car2 = new ConstructorCar();console.log(car2.drive());// 工厂函数const proto = { drive () {  console.log('Vroom!'); }};function factoryCar () { return Object.create(proto);}const car3 = factoryCar();console.log(car3.drive());

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

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

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

class Foo {}console.log(typeof Foo); // function

构造函数和ES6类的好处

大部分的书会教你去用类和构造函数 ‘ this ' 是指向新的这个对象的。 一些人喜欢 new 关键字的可读性 也许还会有一些很小的细节方面的差别,但是如果在开发过程中没有问题的话,也不用太担心。

构造函数和ES6类的坏处

1. 你需要 new 关键字

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

function Foo() { if (!(this instanceof Foo)) { return new Foo(); }}

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

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

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

3. 构造器没有遵守 Open / Closed 法则

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

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选