乐趣区

Es6中Class私有和受保护的属性及方法

熟悉面向对象编程的都知道,面向对象编程最重要的原则之一 – 从外部接口划分内部接口。也就是说,针对某一类事物,我们其实并不是那么在乎其内部究竟是怎样去实现的,只关心怎样使用而已。

为了理解这点,让我们先来看看现实生活中的列子。通常,我们使用的设备非常复杂。但是从外部接口界定内部接口允许使用它们没有什么问题。列如一辆汽车。从外面看主要有:轮子、车身、车顶、方向盘等。

但是,内部 …

有许多的细节,但是我们并不用去知道这些细节,也可以很好地开车车。

汽车非常可靠,不是吗?我们可以使用很多年,只有在出现问题时才能使用它 – 进行维修。汽车的可靠性和使用的简单性在于隐藏内部细节。

如果我们从汽车上取下发动机,那么使用它将会复杂得多(安装在哪?),并且危险(它可以电击)。

所以,面向对象编程就类似于汽车一样。

内部和外部接口

在面向对象的编程中,属性和方法可以分为两组:

  • 内部接口 - 方法和属性,可以从类的其他方法访问,但不能从外部访问
  • 外部接口 - 方法和属性,也可以从外部访问

如果我们继续与汽车进行类比 – 内部隐藏的部分:发动机、变速器、半轴等 – 是其内部接口。对于对象的运行,内部接口是非常有用的,其细节互相使用。例如,弹性元件连接到减震器。

但是从外面看,汽车被外层车壳保护着,所以没有人可以接触到。细节隐藏且无法访问 。我们 可以通过外部接口使用它的功能。所以,我们在使用一个对象的时候,并不关心它内部是怎样工作的。

在 JavaScript 中,有两种类型的对象字段(属性和方法):

  • 公共的:随处都可访问,它们包含外部接口,我们在开发中一直常用的也就是公共的属性和方法了
  • 私有的:仅在类的内部课访问,主要用于内部接口

在许多其他语言中,还存在“受保护”字段:只能从类内部访问和扩展它们。它们对内部接口也很有用。它们在某种意义上比私有更广泛,因为我们通常希望通过继承类来获取和访问它们。

受保护的字段不是在 JavaScript 语言级别上实现的,但实际上它们非常方便,我们也可以模拟地去实现它们。现在我们用 JavaScript 来制作一台具有这些类型属性的汽车。

退出移动版