JS中原型链的理解
一、了解构造函数、原型和实例之间的关系( 实例原型三角形 )
|
|
- 在构造函数上,都有一个 原型属性
prototype
,该属性也是一个对象( Object 的实例 ); - 原型对象上有一个
constructor
属性,该属性指向 原型对象所属的构造函数 ; - 而实例对象上也有一个
__proto__
属性,该属性也指向 构造函数的原型属性 ( 即指向自己的原型对象 ),它是一个非标准属性,不可以用于编程,它是浏览器使用,便于快速访问查看实例的原型属性。
|
|
看图理解函数、原型和实例之间的关系( 绘制原型实例三角形 )
- 凡是构造函数就有原型属性, 凡是实例对象就有原型对象.
- prototype 和 proto都指向同一个对象。 这个对象在构造函数角度来看, 是利用 prototype 属性获得到的, 因此将其称为 构造函数的 原型属性, 简称原型.如果站在实例对象和这个神秘对象的角度来看, 神秘对象被称为 实例对象的 原型对象, 简称为原型.
二、什么是原型链
说白了,其实就是有限的实例对象和原型之间组成有限链,用来实现 属性共享 和 继承。
|
|
三、接下来探究 继承 问题
|
|
实现继承的方法:
1. 原型继承
|
|
2. 直接替换原型对象:
|
|
- 它不方便给父级类型传递参数;
- 父级类型当中的引用类型被所有实例共享
3. 标准继承:利用 Object.creat()方法 实现继承
|
|
Object.create() 方法使用指定的原型对象和其属性创建了一个新的对象。它是 ES5 的新特性。
语法:
Object.creat( 对象 ) -> 新的对象
意义:
返回的新对象,原型继承自 create 方法参数中提供的对象。
用途:
|
|
4. 借用构造函数继承:
|
|
可以解决原型继承中的传参问题,但是父类型当中的原型对象上的成员 ( 属性和方法 ) 不能被继承到。
5. 混入式继承:
|
|
6. 组合继承:
|
|
四、属性搜索原则 和 写入原则
属性搜索原则
- 在访问对象的某个成员的时候会先在当前对象中查找是否存在,如果当前对象存在,停止查询;
- 如果当前对象中没有,就在构造函数的原型对象中查找,如果存在,停止查询;
- 如果原型对象中没有找到,就到原型对象的原型中查找…
- 直到找到或者查询到Object的原型对象的原型是 null 为止。
写入原则
在 获取 一个对象的属性值或方法的时候,才会沿着原型链向下寻找, 属性赋值 没有这个,如果是给对象设置成员( 属性或方法 ),都是在当前对象上进行设置。
|
|
五、拓展
proto属性
|
|
|
|
Object.prototype 相关
Object.prototype中常用成员
|
|