夜下客

繁体版 简体版
夜下客 > JS修炼法则 > 第8章 JS原型(链)

第8章 JS原型(链)

原型(链)

引子:proto和prototype有什么关系?

1. 原型

1-1. 定义

每个函数都有一个 prototype 属性,这个属性是一个指针,指向原型对象。

JavaScript 中所有的对象都有一个内置属性,称为它的prototype(原型)。 它本身是一个对象,故原型对象也会有它自己的原型,逐渐构成了原型链。 原型链终止于拥有 null 作为其原型的对象上。 备注: 指向对象原型的属性并不是 prototype

1-2. 作用

(1).共享属性和方法,节省内存空间

(2).实现继承

实例对象继承了原型对象的属性和方法

1-3. 分类

隐式原型:每个对象都有__proto__属性,它指向对象的原型对象。 显式原型:每个函数都有prototype属性,它指向对象的原型对象。只有函数才有prototype属性。

在 JavaScript 中,函数是一种特殊的对象。

1-4. 结论

原型对象是构造函数的一个实例。

Function 的隐式原型指向自己的原型 Object 的隐式原型指向 null

2. 原型链

2-1. 定义

当读取实例的属性时,如果找到,就会查找与对象类型的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层 null 为止。相互关联的原型组成的链状结构就是原型链。

原型链的本质就是沿着__proto__进行查找。

我们现在知道每个 函数 都有一个prototype,那再介绍一个隐式原型, __proto__是每个 对象 都有的一个隐式原型,换句话说,这个奇怪的__proto__引用了内部的原型对象,实际上__proto__并不存在你正在使用的对象中,当获取a.__proto__时,实际上调用了a.__proto__(调用了getter函数),getter不在我们目前的讨论范围内了,我们只需要知道__proto__是我们用来获取对象内部原型的方法,跟es5的标准Object.getPrototypeOf(a)结果一样。

2-2. 作用

继承(委托更恰当)

2-3. 形成

依赖于__proto__。 这种连接存在于实例和构造函数的原型之间。

2-4. 原型链经典图

红色线条即为原型链。

下面我们再看一个原型链的应用实现,原型继承的代码和图示。

无论您使用哪种模式来创建对象,都可以使用该Object.getPrototypeOf方法来获取该对象的原型。

请注意,我们仅支持 Object.create 的单个参数。官方实现还支持第二个可选参数,它允许您向创建的对象添加更多属性。

箭头函数没有自己的this关键字。因此,箭头函数不能是构造函数,如果您尝试使用关键字调用箭头函数new,它将引发错误。

『加入书签,方便阅读』