用了这么多年的 JavaScript,对于原型链这东西自觉是理解了,但是日常工作中很少使用的“继承”部分最近突然想起来竟觉得有点陌生,所以在这里稍微理一下思路。
本文**90%**不能让不懂原型链的人看懂原型链,但是可能可以给懂一点原型链的人一点提示,不过如果本文让你更混乱的话,请在评论区提出疑问 😂
prototype
只有函数有 prototype,对象没有。
proto
__proto__
可以看成一种“连接”,所到之处的属性(property)都可以访问。刚进坑的时候听说 __proto__
不是标准的属性,可能会有不同的实现,但这么多年过来了似乎也就只用 __proto__
。
a 显然没有 hasOwnProperty 这个属性,于是他会往 __proto__
找,在 Object.prototype 下找到 hasOwnProperty
并使用。
一般,一个 __proto__
会被连接到一个 prototype,但你仍可以直接定义 __proto__
所谓的原型链就是由 __proto__
串成。
__proto__
也可以直接连接到一个对象(换句话就是,继承一个对象的属性):
实例化
在 new
一个对象时,实际上做了什么,如何自己写一个 new
(据说面试会考,不过我没遇到过):
继承
上面说过用 Object.create
继承一个对象的属性,这里的继承说的是“类”继承。
JavaScript 在 ES6 之前,其实没有类,所谓的继承就是沿着原型链访问父类(准确来说是 constructor)的变量和方法。
(顺带一提,想要了解 ES6 之后的类可以看看 Class 继承与 super,从这篇文章还可以看出,ES6 的类不是单纯的语法糖)
在 proto 部分说明了原型链的结构,下面讲讲实际上怎么构造原型链。
无论接着还要继承多少次,总之,记住 __proto__
串通了父子的 prototype
就好了。