一、原型
1.函数的prototype属性
- 每个函数都有一个prototype属性,它默认指向一个Object空对象(即:原型对象);
- 原型对象中有一个属性constructor.它指向函数对象。
- 给原型对象添加属性(一般是方法),实例对象可以访问。
二、显示原型与隐式原型
1.每个函数function都有一个prototype,即显示原型(属性)
2.每个实例对象都有一个_proto_
,称为隐式原型。
3.对象的隐式原型的值为其构造函数的显示原型的值。
console.log(Fn.prototype===fn._proto_);//true
4.函数的prototype属性:在定义函数时自动添加的,默认值是一个空的Object对象
5.对象的_proto_
属性:创建对象时自动添加的,默认值为构造函数的prototype属性值。
三、原型链
js
引擎在执行代码的时候会先执行一些默认的代码,比如这里会先创建一个Object构造函数。- 解释原型链:访问一个对象的属性时,先在自身属性中查找,找到返回。如果没有,再沿着
_proto__
这条链向上查找,找到返回。如果最终没有找到,返回undefined。寻找的尽头是Object构造函数的原型对象的_proto_
.它的值时null;
别名:隐式原型链。
作用:查找对象的属性。
- 特殊:函数都是Function的实例对象,所以函数既有显示原型对象(prototype),也有隐式原型对象(
__porto__
)。函数的隐式原型对象是Function的原型。 - 所有函数的
_proto_
都是一样的,因为所有的函数对象都是通过new Function()的方式产生的。
四、原型继承
构造函数的实例对象自动拥有构造函数原型对象的属性(方法)。利用的就是原型链。
五、两个特殊函数
- 一般来说,函数的显示原型是一个object实例空对象。但是对于object构造函数来说,他的原型不是object实例空对象。
console.log(Object.prototype===Object);//false
consle.log(foo.prototype===object);//true
- 还有一个特殊的函数就是Function,它的原型对象是一个空Object对象。当然Object空对象的
_proto_
指向的是Object的原型。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkXy6Ztp-1619088069373)(C:\Users\86185\AppData\Roaming\Typora\typora-user-images\image-20210328222313907.png)]
- 所有函数都是Function的实例,包括它本身(Function)。
cosole.log(Function._proto_===Function.prototype);//true
六、原型链属性问题
1.读取对象的属性值时,会自动到原型链中查找
2.设置对象的属性值时,不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值。
取对象的属性值时,会自动到原型链中查找
2.设置对象的属性值时,不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值。
3.方法一般定义在原型中,属性一般通过构造函数定义在对象本身上。