04.1.函数高级原型及原型链

一、原型

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.方法一般定义在原型中,属性一般通过构造函数定义在对象本身上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值