📚关于面向对象
面向对象就是把需要解决的问题分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述每个对象在解决问题中的行为,面向对象的核心是对象。
关于面向对象思想,我们可以将同一类事物的操作代码封装成对象,将用到的变量和函数作为对象的属性和方法,然后通过对象去调用,这样可以使代码结构清晰、层次分明。在团队开发中,使用面向对象思想编程可以帮助团队更好地协助分工,提高开发效率。
通过下面这张图片我们可以大致了解面向对象所包含的内容
❗关于面向对象编程的优势如下。
- 模块化更深,封装性强。
更容易实现复杂的业务逻辑。
更易维护、易复用、易扩展。
❗关于JavaScript开发中的面向对象设计思想,以及类的基本使用就不一一介绍了
📚构造函数和原型对象
1️⃣构造函数
构造函数主要用来创建对象,并为对象的成员赋初始值。我们可以把对象中的一些公共的属性和方法抽取出来,封装到构造函数中。
function Person (name, age) { this.name = name this.age = age this.say = function () { console.log('i can say') } } const p1 = new Person('a', 21) const p2 = new Person('b', 20) console.log(p1.name) console.log(p2.age) p2.say()上述代码用面向对象思想封装了一个Person构造函数,在构造函数中,有name和age两个属性,以及say()方法。
❗构造函数和类的区别
类中的成员方法是定义在类中的,使用类创建对象后,这些对象的方法都是引用了同一个方法,这样可以节省内存空间。
class Person { say () { console.log('hi') } } const p1 = new Person() const p2 = new Person() console.log(p1.say === p2.say)使用构造函数创建的对象并不是引用同一个方法,示例代码如下。
function Person () { this.say = function () { console.log('i can say') } } const p1 = new Person() const p2 = new Person() console.log(p1.say === p2.say)2️⃣原型对象
为了解决上述问题,就需要利用原型对象来实现。
在JavaScript中,每个构造函数都有一个原型对象存在,这个原型对象通过构造函数的prototype属性来访问,示例代码如下。
function Play () { } console.log(Play.prototype) console.log(typeof Play.prototype)在上述代码中,Play函数的prototype属性指向的对象就是Play的原型对象。
利用原型对象,可以实现为所有的实例对象共享实例方法,我们可以将实例方法定义在原型对象中,然后所有的实例方法就都可以访问原型对象的方法了。因此,原型对象其实就是所有实例对象的原型。下面我们通过代码演示原型对象的使用。
function Person (name) { this.name = name } Person.prototype.sayHello = function () { console.log('你好,我叫' + this.name) } const p1 = new Person('张三') const p2 = new Person('李四') console.log(p1.sayHello === p2.sayHello)// 输出结果:true p1.sayHello()// 输出结果:你好,我叫张三 p2.sayHello()// 输出结果:你好,我叫李四从上述代码可以看出,实例对象p1和p2原本没有sayHello()方法,但是在为原型对象添加了sayHello()方法以后,p1和p2就都拥有了sayHello()方法,并且是同一个方法。在原型对象的方法中,this表示的是调用此方法的实例对象。