You Don't Know JS: this & Object Prototypes( 第4章 Mixing "Class" Objects)

时间:2022-08-27 05:12:09

本章移到“Object oriented programming”和"classes"。

看‘class orientation‘ 的设计模式: instantiation, inheritance, relative 多态性。

会重点讲解oop理论,当讲到Mixins, 我们会最终联系这些思想到真实的JS代码。

在这之前会先说大量的概念,pseudo-code,所以不要迷失,stick with it!!


Class Theory

OO or class oriented programming , 通过适当的设计把数据和行为一起打包。

在正式的计算机科学,也叫做数据结构。

Classes也暗示了类化某个数据结构的方法。

And thus, classes, inheritance, and instantiation emerge. 如:车辆, 小轿车, 具体一辆小轿车。

另一个概念是:多态。

描述了从父类继承基本的行为后,在一个子类重写这些基本的行为赋予更多特色。

因此,父类和子类对某一行为应当共享相同的name,以便子类重写。

如此做,会导致JS code变得脆弱和让人frustration.

"Class" Design Pattern

OOp这种设计模式只是一种可选的代码概念。

有些语言如C/PHP还有 procedural syntaxes。

JavaScript "Classes"

JS 有一些类的句法元素:new , instanceof

在ES6中添加了更多的,如class关键字。(见Appednix A)

但是,JavaScript 实际上是没有classes的

JS试图满足非常普遍的愿望:通过提供类似类的句法,用类设计!

事实:其他语言的类和JS中的“classes”是不一样的。

类是一种可选的设计模式,因此你可以选择在JavaScript中使用或者不用。

因为很多开发者喜欢用oop设计模式,所以本章会探索:JS提供了什么导致类的错觉,和我们经历的错误点。


Class Mechanics

在许多对象编程语言,标准库提供了a 'stack' 数据结构,作为一个Stack类。

这个类有内部的一系列变量用于存储数据。并且它会提供一系列的公共地可存取的行为(方法) 。

这让你的代码有和这个data交互的能力。

但是,你无需直接在Stack上操作。Stack 类只是一个抽象的解释关于任意的stack应当做什么,它自己不是一个'stack'。 你必须实例这个Stack类。然后才能有一个具体的数据结构的东西来操作。

Building 类的比喻:建筑物蓝图。

依照蓝图建立实物,这个实物就是instance。继承就是从一个基本蓝图,增加内容变成子蓝图。

Constructor

一般和类名字相同。实际就是初始化这个实例的任何状态。

例子:

Joe = new ClassName()

实例化了一个类。


Class Inheritance

没啥新的。略

class Vehicle {
engines = 1 ignition() {
output( "Turning on my engine." )
} drive() {
ignition()
output( "Steering and moving forward!" )
}
} class Car inherits Vehicle {
wheels = 4 drive() {
inherited:drive() //有些语言使用super
output( "Rolling on all ", wheels, " wheels!" )
}
}

Polymorphism 多态。

子类被他们的父类给予继承的行为的复制。

如果一个行为在子类被重写,不影响父类的行为,父类的原先版本的行为不会改变的。

Class inheritance implies copies.

类的继承就是暗含了复制!!

Multiple Inheritance

少数语言提供多重继承。

JS不提供原生的多重继承的机制!

但可以模仿。比如