Javascript

面向对象编程

对象的抽象

抽象 是指一种归纳或总结,对象 是现实世界物体特征的实体。万事万物不论大小皆可看做对象, 则是对各种不同对象的 归纳总结,类是对象的 抽象表示形式

例如,男演员Jack可以看做是一个对象,女演员Rose也可以看过是一个对象,而两者会被统一归纳为Person或者Human的类(或抽象)。每一个对象都有其独特的属性(Property)或功能(Function),而归纳总结出来的类则具有不同对象的相同属性或功能。

基于类的面向对象语言是面向对象世界里的主流。虽然大多数面向对象开发语言都使用类来完成面向对象编程,但类不是面向对象编程的实质内涵。面向对象的实质内涵是将所有业务逻辑单元都视为一个对象(即,对象是目的或结果),且类不是唯一用来完成面向对象编程的方法。

面向对象不能被当做面向类,否则会进入误区。对象和类的关系相当于一般程序设计语言中的 变量变量类型 的关系。所以,有时类也被称为是一种数据类型,可以看做抽象数据类型的具体实现。此时的数据类型则是 数据 操作 的集合。

面向对象与面向过程的区别

面向过程程序设计,即结构化程序设计,诸如Pascal、C。

面向对象程序设计解决了结构化程序设计代码复用的难题,如C++、C#、Java、JavaScript、Python等都是。

image-20210413144641711

面向过程也是把程序定义为“数据+作用于数据的操作算法”,但最重要的区别是:面向过程编程 使用过程操作数据结构, 而面向对象编程将过程和数据结构捆绑,使对象 操作自己的数据结构

JavaScript的类

类的创建

JavaScript可以用关键字 class 进行赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}

// 方法一:参数赋值法,间接调用构造器赋值
var oRectangle = new Rectangle(10, 20);

// 方法二:生成对象后单独调用赋值
// var oRectangle = new Rectangle();
// oRectangle.height = 10;
// oRectangle.width = 30;

console.log(oRectangle.height, oRectangle.width)

在MDN Web Docs中,对JavaScript类的定义如下:

实际上,类是“特殊的函数”,就像你能够定义的函数表达式和函数声明一样,类语法有两个组成部分:类表达式 类声明

1
2
3
4
5
6
7
8
function HelloWrold(){    //To use keyword `function` instead of `class` to define a class
this.printInfo = function(){
return "Hi! JavaScript!\n";
}
}
var oHelloWorld = new HelloWorld(); // Make a new object of the class named `HelloWorld`
var result = oHelloWorld.printInfo(); //Call the method of the object to assign
document.write(result);

构造器

构造器(Constructor),或称 构造方法,一种用于创建和初始化class创建的对象的特殊 方法(Methods)constructor([arguments]) { ... }, 其中 arguments 看情况而定,可以省略。

注意

  1. 在一个类中只能有一个名为 constructor 的特殊方法。 一个类中出现多次构造函数 (constructor)方法将会抛出一个 SyntaxError 错误。
  2. 在一个构造方法中可以使用 super 关键字来 调用一个父类的构造方法
  3. 如果没有显式指定构造方法,则会添加默认的 constructor 方法。
1
2
3
4
5
6
7
8
9
10
11
class Polygon {
constructor(arg0, arg1) {
this.name = 'Polygon';
this.body = arg0 + arg1;
}
}

const poly1 = new Polygon(10,20);

console.log(poly1.name, poly1.body);
// expected output: "Polygon" 30