要说到「面向对象」编程,就得横向的说到「面向过程」编程和「面向函数」编程。这些都不是具体的代码,而是一种编程思想。用不同的编程思想就会写出不同的代码,另外不同的编程思维可以帮助我们更好的理解代码的运行机制。
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 中原型出现的本质原因。