「js - classes」class 1

What is Object-Oriented Programming

Posted by My on August 12, 2023

要说到「面向对象」编程,就得横向的说到「面向过程」编程和「面向函数」编程。这些都不是具体的代码,而是一种编程思想。用不同的编程思想就会写出不同的代码,另外不同的编程思维可以帮助我们更好的理解代码的运行机制。

What is Procedure-Oriented Programming?

通俗的理解就是第一步做什么,第二步做什么,第三步做什么,依次类推。这种编程思想的特点是将问题分解成一系列步骤,然后一步一步的解决,很有顺序性。就像把大象放进冰箱的过程一样,一步一步的把它放进去。

What is Function-Oriented Programming?

在「面向函数」编程中,我们通过定义函数来实现功能。函数是一系列语句,用来实现某个功能。函数的输入和输出都是通过参数和返回值来传递的。

但是,并不是说写了一个函数,这就是「面向函数」编程了,这是一种编程思维,不是说具体写了什么代码。简单来说,函数就是用来运算的,那我们需要关注的是怎么运算,不同运算之间有什么联系,以及运算的结果如何影响到其他运算。

比如说,物体在页面上的移动,我们需要用不同函数来实现不同的运算,比如计算距离(getDistance),计算角度(getTheAngle),计算速度(getSpeed)等等。这些运算之间有什么联系,以及运算的结果如何影响到其他运算,这些都是需要考虑的。

What is Object-Oriented Programming?

在「面向对象」编程中,我们通过定义类来实现功能。类是一系列属性和方法的集合,用来实现某个功能。类可以包含属性和方法,属性可以保存数据,方法可以实现功能。

「功能」是要点,也就是说这种思维关注的是程序里有什么功能(或者说是事物),而不是具体的实现。

谈到「面相对象」,那就得说到 「类」,「类」是一种类别,用来描述一类事物的属性和行为。「对象」是具体的事物,是类的实例。

比如说,我们可以定义一个「人」类,这个类包含属性(姓名,年龄)和方法(说话)。这个类可以用来创建「人」对象,然后调用方法来实现人类的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

const person1 = new Person('John', 25);
person1.sayHello(); // Output: Hello, my name is John and I am 25 years old.

其中,new peerson() 就是 JS 里表达对象的方式,pserson1 这个实例对象是从属于 Person 类。

那在 JS 中,是如何知道这个对象是从属于哪个类的呢?答案是,JS 引擎会在内存中维护一个对象表,用来存储所有创建的对象。每一个对象都有一个 __proto__ 属性,指向它的原型对象。也就是说,某个对象的 __proto__ 指向某个类的 prototype ,那么这个对象就从属于这个类。这就是 JS 中原型出现的本质原因。