什么是面向对象?
简单点说,就是我们不需要知道内部原理,就知道如何使用它的功能,就是面向对象。对象是一个整体,对外提供一些功能,而你不知道它内部是怎么操作的。
面向对象特点
1、抽象:指把核心的东西抽出来,把解决问题有关的东西拿出来摆在面前。比如把学生的核心信息名字和学号等信息抽出来,爱玩还是爱学习、开朗还是腼腆等不是核心的信息可以摒弃。
2、封装:让使用对象的人不考虑内部实现,只考虑使用功能。把内部代码保护起来,只留些接口供用户使用。
3、继承:为了代码的复用,从父类上继承一些属性和方法,子类也可以有自己的属性和方法。比如儿子继承父亲的姓。
4、多态:实际上是不同对象做同一操作产生不同的效果。多态的思想是把“想做什么”和“和谁做”分开,比如上课铃响了,上体育课的学生跑到操场上站好,上语文课的学生在教室里坐好一样。
面向对象原型继承
在 JavaScript 中每个函数都有一个 prototype 属性,这个属性指向函数的原型对象,原型可以理解为“父类”,默认的原型是 Object,可以通过 __proto__ 指定原型。
var student = {
name: 'student',
study: function() {
console.log(this.name + " study...");
}
}
var xiaoming = {
name: 'xiaoming'
}
// 将 xiaoming 的原型改为 student
// 可以理解为 xiaoming 继承了父类 student 的方法
xiaoming.__proto__ = student;
执行 xiaoming.__proto__ = student; 之前:
执行之后:
面向对象class继承
class 关键字是 ES6 引入的。
// 定义一个学生的类
class Student {
constructor(name) {
this.name = name;
}
hello() {
console.log('hello:' + this.name);
}
}
var xiaoming = new Student("xiaoming");
xiaoming.hello();
// 继承
class xiaoStudent extends Student {
constructor(name, age) {
super(name);
this.age = age;
}
getAge() {
console.log("我是:" + this.name + ",今年 " + this.age + " 岁");
}
}
var xiaohong = new xiaoStudent("xiaohong", 5);
xiaohong.hello();
xiaohong.getAge();
执行结果:
输出 xiaoming 可以看到其实 class 继承的本质也是修改了原型,但是却是我们能更好理解和接收的形式。
原型链
在 JavaScript 中每个函数都有一个 prototype 属性,这个属性指向函数的原型对象,这个原型对象还可以有自己的原型对象,以此类推,形成了一个原型链。
如上面的例子,xiaohong 的原型是 Student,Student 的原型是 Object,就是一个原型链。