【JS-task05】JS中的原型链是什么?
分享人:杨亚洲
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多提问
1.背景介绍
1.构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象。每个构造函数都有prototype(原型)属性。
2.原型模式
每个函数都有prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含特定类型的
所有实例共享的属性和方法,即这个原型对象是用来给实例共享属性和方法的。 而同样的构造函数的原型对象
上也有一个指针(constructor构造函数),指向构造函数本身。

3.实例对象
实例对象是通过new操作符+构造函数的形式,生成的对象。
实例对象里面有一个内部属性[[prototype]],指向构造函数的原型对象。
先搞清楚这三者之间的关系吧
4._proto_的指向
_proto_的指向是根据创建该对象的创建方式来区分的。现阶段主要有3种。
a、字面量的形式
b、构造函数模式
c、Object.create()

5、原型链
我们知道构造函数里面有一个属性是prototype,这个属性是一个指针指向构造函数的原型对象,而原型对象里面
同样有一个指针(constructor),指向原型对象。而对构造函数的实来说,它有一个内部指针[[prototype]]指
向构造函数的原型对象。如果这个原型对象是另外一个构造函数的实例,那么此时原型对象又包含一个内部指针
[[prototype]]指向另一个构造函数的原型对象,如此层层递进,就构成的实例与原型的链条,也就是所谓的原型链

2.知识剖析
构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象。 即为对象变量赋初始值。
每个构造函数的实例都将共享构造函数的初始值。 构造函数的出现是为了解决使用Object构造函数
和字面量表示法不方便创建大量重复对象的问题。
传统创建对象实例的方法

这个方法如果用于创建大量相同属性和方法的对象时,会产生大量重复代码
构造函数的方法

原型模式
使用构造函数的问题是,每个方法都要在每个实例上重新创建一遍,即在构造函数的不同实例
上的同名函数是不相等的。而我们创建每个构造函数都有一个prototype(原型)属性,这个属
性是个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法,
我们使用这个原型对象来共享实例的属性和方法的模式就叫原型模式
注:每个原型对象都有constructor属性,由于简写模式重写了默认的prototype对象,
所以constructor也会被重新定义,不再指向他的构造函数,所以可以自己写一个constructor属
性指向他的构造函数

原型链
每个构造函数都有原型对象,每个构造函数实例都包含一个指向原型对象的内部指针
(__proto__),如果我们让第一个构造函数的原型对象等于第二个构造函数的实例,
结果第一个构造函数的原型对象将包含一个指向第二个原型对象的指针,再然第三个原型对象等于第一
个构造函数的实例,这样第三个原型对象也将包含指向第一个原型对象的指针,以此类推,就够成了实例于原型的链条
,这就是原型链的基本概念

3.常见问题
若想访问一个对象的原型,应该使用什么方法?
4.解决办法
获取实例对象obj的原型对象,有三种方法
1. obj.__proto__
2. obj.constructor.prototype
3. Object.getPrototypeOf(obj)
上面三种方法之中,前两种都不是很可靠。最新的ES6标准规定,
__proto__属性只有浏览器才需要部署,其他环境可以不部署。
而obj.constructor.prototype在手动改变原型对象时,可能会失效。
5.编码实战
6.扩展思考
Function 也是构造函数? 所以function.__proto__指向Function.prototype?
Function是构造函数,所有函数都是Function的实例,所有函数的__proto__的都是指向
Object的原型对象
7.参考文献
8、更多提问
1、若想访问一个对象的原型,应该使用什么方法?
a. obj.__proto__
b. obj.constructor.prototype
c. Object.getPrototypeOf(obj)
上面三种方法之中,前两种都不是很可靠。最新的ES6标准规定,
__proto__属性只有浏览器才需要部署,其他环境可以不部署。
而obj.constructor.prototype在手动改变原型对象时,可能会失效。
2、[[prototype]]这个属性能访问到吗?
这个实例的内部属性,是一个指针指向构造函数的原型对象,我们是访问不到这个属性的。
只能通过__proto__方法原型对象。
3、构造函数用来生成对象的过程是什么样的?
a、隐式创建一个对象
b、将构造函数的作用域指向这个对象(this)指向这个对象
c、执行构造函数里面的代码
d、返回这个对象