我们每学习一个概念,不仅要知道它是什么,还要知道它是用来解决什么问题的。
先说总结:
JavaScript 没有类,继承全靠原型链。(即__proto__和 prototype 之间的关系)
所以原型链是用来解决 JS 中的继承问题的。(指 ES6 之前,ES6以后有了 class 和 extends 语法糖)
以下正式开始。
在 Javascript 中,一直都有这么一种说法,万物皆对象。
不知道大家怎么理解这句话?
举个例子大家来看看:
let aa = {};
let bb = [];
let cc = function() {};
console.log(aa instanceof Object); // true
console.log(bb instanceof Object); // true
console.log(cc instanceof Object); // true
这是不是就充分说明了JavaScript 万物皆对象?对吧。但是呢,
其实在 JS 中,对象也是有区别的,我们可以将其划分为普通对象和函数对象。
如何区分普通对象和函数对象呢?其实记住这句话就行了:
- 所有 function 的实例都是函数对象,而其他的都是普通对象;
ok,咱们继续,输出一下函数对象和普通对象看看他们都有什么属性:
我们可以看到,普通对象只有一个 <prototype> ,而函数对象有 <prototype> 和 prototype。
(PS:<prototype>属性是火狐浏览器的表示方式,在谷歌浏览器下显示为__proto__。同一个东西只是显示方式不同而已)
即:
那__proto__ 和 prototype 分别都是什么呢?
prototype 是函数对象独有的属性,而__proto__是一个指针,它指向创建出它的函数的 prototype。
ok,我们来检验一下上边这句话对不对:
对象.__proto__ == 构造函数.prototype
而 prototype 也是一个对象,它也有自己的 __proto__
这样的话,我们就可以一级一级往上找,这
就形成了 JS 的原型链了,即:
子类没有的方法或属性可以通过上边的等式访问到父类的方法或属性。
ok完结,撒花 🌸✨🌼🌻🌺