ffe 03 原型
原型(prototype)是JavaScript里的一个重要概念。它本来是极简单的。但因为一些原因,原型时常让试图了解它的人感到复杂。
原型是对象的属性,它可以让一个对象从其他对象处获得额外的数据和方法。对象的原型一般也是对象,它也可以有原型,这便形成了原型链。
1.设置对象的原型
可以通过如下几种方式设置对象的原型。
-
.__proto__
因为原型就是对象的属性,直接设置对象的__proto__属性是最符合直觉的。但这反而是ES标准不推荐的用法。部分原因是并不是所有的浏览器都暴露了__proto__属性。
-
Object.setPrototypeOf(object,prototype)
推荐的设置对象原型的方式。
-
Constructor.prototype
设置构造器函数的prototype属性,那么通过new
Constructor()生成的对象的原型就是Constructor.prototype本身。不要和对象的__proto__属性混淆了,只有函数(构造器函数)有prototype属性。这两个属性是两种设置对象原型的方式,殊途同归。
-
Object.create(prototype)
创建对象时,指定它的原型。
2.读取对象的原型
与设置对象的原型相对应,读取对象的原型有以下几种方式
- .__proto__
- Object.getPrototypeOf(object)
- Constructor.prototype
3.原型有什么用?
无论通过哪种方式设置对象的原型,目的都是让对象获得额外的数据和方法。
有点像是A对象在“借”B对象的属性,海棠花“借得梅花一缕魂”的那个借。比如内置的数组对象,它的原型是Array.prototype,每个数组自然就“有”了Array.prototype里的方法。
另外原型链的存在,可以让一个对象“借”得更远。比如A的原型是B,B的原型是C,那么A也可以访问C的属性。