JS面向对象(四)

70 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

前言

-面向对象有三大特性:封装、继承、多态

  1. 封装:我们前面将属性和方法封装到一个类中,可以称之为封装的过程;
  2. 继承:继承是面向对象中非常重要的,不仅仅可以减少重复代码的数量;
  3. 多态:不同的对象在执行时表现出不同的形态;

面向对象的特性 – 继承

继承具体是做什么的呢?

继承可以帮助我们将重复的代码和逻辑抽取到父类中,子类只需要直接继承过来使用即可。

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操作符会执行一下的操作:

  1. 在内存中创建一个新的对象(空对象);
  2. 这个对象内部的[[prototype]]属性会被赋值为该构造函数的prototype属性;
  3. 构造函数内部的this,会指向创建出来的新对象;
  4. 执行函数的内部代码;
var obj1 = {} //相当于var obj1 = new Object()
obj1.__proto__ === Object.prototype

从Object直接创建出来的对象的原型都是 [Object: null prototype] {}