共计 699 个字符,预计需要花费 2 分钟才能阅读完成。
先来一张图看看几个名词的关系 构造函数、原型、实例
原谅我的狂草字体,我手写比用电脑画快。
今天我们只说原型链,所以接下来我就围绕着原型链的几个部分说起。
这个大家都很熟悉了,首字母大写的函数我们都可以作为构造函数,不是说小写的就不能 new,也是可以的,暂时说成约定俗成吧!
// 构造函数
function Fn() {}
// 原型对象
console.log(Fn.prototype)
//new
let fn = new Fn()
// 实例
console.log(fn)
代码部分结束了,今天我们就用这 4 行代码描述一下上图也就是原型链的来龙去脉。
每个函数都有一个属性 prototype, 借用 **Function.prototype** 属性存储了 Function 的原型对象。
验证了我草图构造函数.prototype 指向原型对象
完整的 log 看一下实例.__proto__也指向原型对象
从 log 里也能看出来
实例原型的 constructor 指向构造函数
最后再说构造函数 new 关键字生成实例
手绘图说完了,我们说正题 原型链,为什么再说原型链之前先画了一个草图,为了帮助预热理解。
每一个原型对象都有一个__proto__属性,这个是我们在代码中继承的关键,也是众多面试官所问的什么是原型链
上图可以看到,第一次__proto__找到了原型对象,第二次__proto__找到了 Object 实例对象,第三次 null 查找结束。
我们平时开发中用到了__proto__去查找链条中我们继承的方法和属性都在 prototype(原型)上,所以不能在 Fn.prototype = xxx 操作, 这样链条就会中断,只能在原型上扩展属性。
明天继续聊继承!
欢迎吐槽!