js 原型,原型链

函数的prototype

1.函数的prototype属性

–每个函数都有一个prototype属性,它默认指向一个Object空对象(称为原型对象(构造函数通过prototype和原型对象通过constructor相互引用))

–原型对象中有一个属性constructor,它指向函数对象

2.给原型对象添加属性(一般都是方法)=>实例对象可以访问

–作用:函数的所有实例对象自动拥有原型中的属性(方法)

显式原型和隐式原型

1.每个函数function都有一个prototype,即显式原型(属性),函数的显式原型指向的对象:默认是空的Object实例对象(但Object,Function不满足)

2.每个实例对象都有一个__proto__ 可称为隐式原型(属性),所有函数都是Function的实例(包含Function)

3.对象的隐式原型的值为其对应构造函数的显式原型的值

4.内存结构

5.总结:

–函数的prototype属性,在定义函数是自动添加的,默认值是一个空object对象

–对象的__proto__ 属性,创建对象时自动添加的,默认值为构造函数的prototype属性值

–程序员能直接操作显式原型,但不能直接操作隐式原型(es6之前)

–运行顺序: 定义构造函数=>创造实例对象=>给原型添加方法=>通过实例调用原型的方法

原型链

1.访问一个对象的属性时:

–先在自身属性中查找,找到返回。如果没有,再沿着__proto__这条链向上查找,找到返回。如果最终没有找到,返回undefined(隐式原型链)

Object的原型对象是原型链的尽头

–作用:查找对象的属性(方法)

另(查找变量看作用域链)

2.构造函数/原型/实体对象的关系(图解)

3.构造函数/原型/实体对象的关系2(图解)

所有函数都是Function的实例(包含Function)

function Fun(){} 相当于(var Fun = new Function())

Function = new Function() (所有函数的__proto__ 都是一样的)

4.原型继承

–构造函数的实例对象自动拥有构造函数原型对象的属性(利用原型链)

原型链–属性问题

1.读取对象的属性时:会自动到原型链中查找

2.设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值

3.方法一般定义再原型中,属性一般通过构造函数定义再对象本身上

instanceof是如何判断的

–表达式 A instanceof B

– 如果B函数的显式原型对象再A对象的原型链上,返回true,否则返回false

–Function是通过new自己产生的实例

猜你喜欢

转载自blog.csdn.net/weixin_43377964/article/details/105163004