原型和原型链

基础理论

1.  函数与对象的关系
· 函数是对象,对象是通过函数创建的;
· 函数与对象并不是简单的包含与被包含的关系。

2. 原型的类别
· 显式原型: prototype,是每个函数function;
· 隐式原型: _proto_, 是每个对象具有的属性;

3. 原型和原型链
· 原型:一个函数可以看成一个类,原型是所有类的一个属性,原型的作用就是给这个类的一个对象都添加一个统一的方法。
· 原型链:每个对象都有一个_proto_,它指向它的prototype原型对象;它的prototype原型对象又有一个_proto_,指向它的prototype原型对象,就这样层层向上直到最终找到顶级对象Object的prototype,这个查询路径就是原型链。

4. JS里最顶层的两个概念
(1). Function是最顶层的构造器,它构造了系统中的所有对象,包括用户对象、系统内置对象,甚至包括它自己。
(2). Object是最顶层的对象
· 所有对象都继承Object的原型;
· Object也是被Function构造出来。

5. instanceof
    obj instanceof F
· 常见的不够正确的描述:用来判断一个对象是否是某个构造函数的实例,比如我们新建一个函数并且实例化

 · 正确的描述:obj._proto_._proto_...=>F.prototype。沿着对象obj的原型链查找是否存在对象F.prototype,若存在则返回true,若查找到原型链的终点Object.prototype仍未找到,则返回false。

原型和原型链的分析

1. 普通的函数&对象:
(1). 函数.prototype  (每个函数都有prototype)
例子:

结构图:

结论: 每个函数下都有prototype属性,prototype的属性值是一个对象,这个对象默认只有一个叫做constructor的属性,指向这个函数本身。

(2). 对象._proto_(每个对象都有隐式属性_proto_)
例子:

结构图:

解释:
[[Prototype]]:是对象的一个内部属性,chrome的引擎通过_proto_向外暴露了这个属性。实际上它可以看作对象的_proto_属性;
_proto_的值:等于构造该对象的函数的prototype属性。testObj._proto_ === test.prototype
结论:每个对象都有一个_proto_属性,指向创建该对象的函数的prototype。

(3). 函数._proto_  (函数是对象,每个函数都有_proto_)
结构图:

解释:Function是最顶级的构造器,函数对象都是通过它构造的
结论:函数._proto_ === Function.prototype

(4). 函数.prototype._proto_(函数.prototype是对象, 所以也有_proto_)
解释:函数.prototype, 它本质上是和var obj = { } 是一样的,由new Object创建的
结构图:

结论:函数.prototyoe._proto_ === Object.prototype

2. 顶级函数&对象:
(1). Object._proto_:
Object是由顶层构造函数Function构造的,Object._proto_ === Function.prototype

(2).  Object.prototype._proto_ :
Object.prototype较为特殊,它是顶级对象的原型,所以它的_proto_指向null。

(3).  Function._proto_:
函数对象都是被顶级构造函数Function创建,所以Function是被自身创建的。
结论: Function._proto_ === Function.prototype

(4).  Function.prototype._proto_
解释:函数.prototype本质上是和var obj = { } 是一样的,由new Object创建的
结论: Function._prototype._proto === Object.prototype

整体顶级结构图:

 

3. 原型链的作用
数据共享、节省内存空间
实现继承

person.father是存在的,也就是说sonFn实现了继承,sonFn本身没有father属性,但是通过原型链进行了查找,找到了fatherFn里面的一个father属性。
---------------------------------------------------------------------------------------------------------------------------------

实例对象的隐式原型属性的值等于构造函数的显式原型的值
原型链:
       访问一个对象的属性时,先在自身属性中查找,找到返回
       如果没有,再沿着_proto_这条链向上查找,找到返回
       如果最终没找到,返回undefined
别名:隐式原型链
作用:查找对象的属性(方法)
---------------------------------------------------------------------------------------------------------------------------------

大家可以结合这篇文章进行查看,其他有关原型和原型链的内容会继续进行补充(69条消息) 函数的prototype属性、显示原型和隐式原型属性_93 Million Miles-的博客-CSDN博客_函数的prototype属性https://blog.csdn.net/m0_52545254/article/details/124297469?spm=1001.2014.3001.5501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值