JavaScript 原型
Javascript 里面的一些内建的基础类型,如 Object,Array,Number,Date,String,RegExp
都是基于函数创建的,在Js的世界里,我们把这种函数叫构造函数。
但也有例外,如Math,只是一个对象,它的__proto__
是Object
。
|
|
__proto__
和prototype
分别是什么呢,是不是和原型有关?
__proto__
可以理解为原型的引用或指针prototype
可以理解为原型对象
举个例子
|
|
很可惜__proto__
这个原型引用的属性不是ES6之前的标准,所以IE浏览器是不支持的。
那又怎么实现对象的扩展呢?
prototype
一直是标准,那么 prototype
又是怎么用于这个场景的呢?
|
|
在ES5的时候,已经支持原生的Object.create,如果为了兼容不支持的浏览器,可以使用以上方法。
|
|
一个对象的原型引用只能一个,这样就形成了一个链,我们把这个链称之为“原型链”。
对象与对象之间的这个继承关系,是通过这种原型链形成的。
创建JS对象有三种方式:直接量创建,构造函数创建,Object.create创建
- 直接量创建最简单
|
|
- 构造函数创建
|
|
- Object.create创建
如上一章节的代码,不再赘述
性能
在原型链上查找属性比较耗时,对性能有副作用,这在性能要求苛刻的情况下很重要。另外,试图访问不存在的属性时会遍历整个原型链。
注意:不好的实践:扩展原生对象的原型(除非移植较新 JavaScript 引擎的特性)