javascript原型及原型链解析

javascript原型及原型链

prototype 每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向了一个对象,而这个对象的用途就是包含可以由特定类型的所有实例共享的属性和方法。
注意:对象是没有prototype属性,只有方法才有prototype属性。

proto 所有引用类型(函数,数组,对象)都拥有__proto__属性。JavaScript 只有一种结构:对象。每个实例对象( object )都有一个私有属性(称之为 proto )指向它的构造函数的原型对象(prototype )。

原型对象 拥有prototype属性的对象,在定义函数时就被创建。

在JS中,声明一个函数A,浏览器就会在内存中创建一个对象B,每一个函数都默认会有一个属性prototype指向这个对象。也就是说prototype的属性的值就是这个对象。对象B就是函数A的原型对象,原型对象B会默认有一个属性constructor指向了这个函数A,也就是说constructor属性的值就是函数A。

在这里插入图片描述

原型链

1.首先说好了的每一个实例都有__proto__,而这个就指向的是构造函数的对象原型,所以ldh.__proto__和Star.prototype是等价的,即ldh.proto`能够只会Star这个构造函数呢,本质上就是通过Star.prototype指回去的。

2.那么我们就会想到Star.prototype的__proto__指向的会是谁呢,一打印就能看的出指向的是Object.prototype,所以不用想也知道他的构造函数肯定是Object了

3.那Object.prototype还有没有__proto__,打印一看就知道是为null,所以我们知道原型的终点就是null

每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条。这就是所谓的原型链的基本概念

完整的原型链
在这里插入图片描述

小结

1.所有函数对象的原型(即fun.proto)都是Function.prototype无论是JS原生的构造函数如Function还是Object等还是用户自定义的构造函数;

2.所有构造函数对应的原型对象的原型(即fun.prototype.proto)都是Object.prototype,无论是自定义的还是原生的

3.存储在函数对象中的属性有_proto_、prototype(其实也有constructor,统统指向Function,就连Function自己的constructor也是指向自己)

4.存储在原型对象中的属性有_proto_、constructor

5.存储在实例对象中的属性有_proto_(其实也有constructor不过和原型对象中的指向一致)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值