持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
前言
-面向对象有三大特性:封装、继承、多态
- 封装:我们前面将属性和方法封装到一个类中,可以称之为封装的过程;
- 继承:继承是面向对象中非常重要的,不仅仅可以减少重复代码的数量;
- 多态:不同的对象在执行时表现出不同的形态;
面向对象的特性 – 继承
继承具体是做什么的呢?
继承可以帮助我们将重复的代码和逻辑抽取到父类中,子类只需要直接继承过来使用即可。
JavaScript当中如何实现继承呢?
要理解JavaScript中的继承我们首先要了解JavaScript中原型链的机制
JavaScript原型链
var obj = { name: "sabo" }
console.log(obj.age)
在上面的代码中
首先我们在obj对象中查找属性,由于没有找到相应属性,这个时候就会去obj的隐式原型中查找属性
obj.__proto__
我们打印一下obj的隐式原型
console.log(obj.__proto__ ) //{}
发现结果是对象,每个对象都会存在它的隐式原型,所以我们可以做以下的操作
console.log(obj.__proto__.__proto__ ) //{}
每一个对象都有自己的原型,而原型也是对象,也有自己的原型,一次类推而形成的链式结构就叫做原型链
顶层原型
原型有没有尽头???
var obj = { name: "sabo" }
console.log(obj.age)
console.log(obj.__proto__)//[Object: null prototype]{}
[Object: null prototype]{} 这个就是顶层原型
顶层原型是从哪里来的???
var obj1 = {}
var obj2 = new Object()
第一种字面量的方式创建对象实际上第二种方法的语法糖
所以就是说我们在创建对象时都使用new操作符
当使用new操作符会执行一下的操作:
- 在内存中创建一个新的对象(空对象);
- 这个对象内部的[[prototype]]属性会被赋值为该构造函数的prototype属性;
- 构造函数内部的this,会指向创建出来的新对象;
- 执行函数的内部代码;
var obj1 = {} //相当于var obj1 = new Object()
obj1.__proto__ === Object.prototype
从Object直接创建出来的对象的原型都是 [Object: null prototype] {}