前言
主要谈谈什么是面向对象编程,面向对象的三大特征以及Javascript中的面向对象
一、什么是面向对象编程
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式。以对象为基本单元,相关数据和函数分组到信息“孤岛”。 这些孤岛称为“对象”。支持面向对象的语言: C++、Java、Python、Javascript等。
function Person (name, age) {
this.name = name; // 数据
this.age = age; // 数据
}
// 函数
Person.prototype.sayName = function () {
console.log(`My name is ${this.name}`)
}
二、三大特征
支持面向对象编程范式的语言基本都能实现继承、封装、多态三大特征。
- 继承
Javascript的继承并不是通过类的方式实现继承特性的。而是通过原型的方式实现的。在Javascript中基于原型继承的方法有很多种。此文只展示其中一种。
// 组合继承
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayName = function () {
console.log(`My name is ${this.name}`)
}
function Student(name, age, studentId) {
Person.call(this, name, age)
this.studentId = studentId;
}
Student.prototype = new Person()
Student.prototype.sayStudentId = function () {
console.log(`My studentId is ${this.studentId}`)
}
上述代码是ES5实现继承的一种方法。ES6通过编写类的方式来实现继承。但底层还是基于原型实现的。
2. 封装
封装是对对象的指定属性或者方法进行限定访问权限。这样保证了模块具有较好的独立性, 易于维护。对于修改带来的副作用减少。
// 通过闭包的方式实现 私有属性和方法
function Person(firstName, lastName) {
var _age; // 私有属性
this.firstName = firstName;
this.lastName = lastName;
this.getAge = function () {
return _age;
};
this.setAge = function (age) {
_age = age;
};
// 私有方法
function _getFullName() {
return `${this.firstName}_${this.lastName}`;
}
console.log(_getFullName.call(this));
}
const p = new Person("Lee", "Harden");
p.setAge(30);
console.log(p.getAge());
console.log(p._getFullName()); // 报错
3. 多态
多态含义: 不同的对象执行相同方法名的方法,得到不同的执行结果。
function Duck() {
this.sound = function () {
console.log("嘎嘎嘎");
};
}
function Cat() {
this.sound = function () {
console.log("喵喵喵");
};
}
function Dog() {
this.sound = function () {
console.log("汪汪汪");
};
}
function animalSound(instance) {
if (typeof instance.sound === "function") {
instance.sound();
}
}
animalSound(new Duck());
animalSound(new Dog());
animalSound(new Cat());