原型与原型链:原型 显式原型与隐式原型 原型链 原型链中的属性问题 原型继承 探索instanceof 测试题 原理图

原型

1.函数的prototype属性

每个函数都有一个prototype属性,它默认指向一个空Object实例对象,空对象也就是没有我们的属性(即称为:原型对象)
原型对象中有一个属性constructor,它指向该原型对象的构造函数对象

2.给原型对象添加属性(一般都是方法)

作用:构造函数的所有实例对象自动拥有构造函数原型中的属性(方法),可以直接使用

显式原型与隐式原型

1.每个函数function都有一个prototype,即显式原型(属性)
2.每个实例对象都有一个_ _proto_ _,可称为隐式原型(属性)
3.实例对象的隐式原型的值等于其对应构造函数的显式原型的值
4.总结
函数的prototype属性:在定义函数时自动添加的,默认值是一个空Object对象
对象的_ _proto_ _属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
程序员能直接操作显式原型(通过显式原型来给原型对象添加属性和方法),但不能直接操作隐式原型(ES6之前)
5.内存结构

原型链

1.原型链

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

2.注意

函数的显式原型指向的对象默认是空的Object实例对象(Object除外,Object.prototype instanceof Object = false)
构造函数和它的原型对象相互引用。
直接创建的对象默认构造函数为Object。
Function的显式原型和隐式原型一样,因为它也是函数,是new自己产生的。
所有函数都是Function的实例包括Function本身,所以它们的_ _proto_ _都是一样的。
Object的原型对象是原型链的尽头,Object.prototype._ _proto_ _ = null。
所有函数的原型对象默认都是Object的实例,Object除外。
原型链一句话说明:实例对象有一个隐式原型指向一个原型对象,原型对象也是一个实例对象,它的隐式原型指向它的原型对象,……,形成了原型链,尽头是Object的原型对象,因为它的隐式原型值为null。

原型链中的属性问题

1.读取对象的属性值时:会自动到原型链中查找
2.设置对象的属性值时:不会查找原型链,如果当前对象没有该属性,直接添加此属性并设置值
3.方法一般定义在原型中,属性一般通过构造函数定义在对象本身上,也就是将属性放在构造函数中初始化(每创建一个实例对象其属性值都是不同的,但其方法是相同的,类似于JAVA,一个类中方法是通用的,但是每个对象的属性不同)

原型继承(基于原型的继承)

构造函数的实例对象自动拥有构造函数原型对象的属性(方法),利用的就是原型链。

探索instanceof

instanceof是如何判断的?

表达式:A instanceof B
判断:A是否是B的实例对象
原理:如果B函数的显式原型对象在A对象的原型链上,返回true,否则返回false(前面实例对象的原型链上是否有后面构造函数的原型对象)

测试题

 

 

 

原理图

学识浅薄,如有错误,恳请斧正,在下不胜感激。

原文地址:https://www.cnblogs.com/yin-jie/p/14745365.html