一.构造函数原型prototype:
构造函数通过原型分配的函数时所有对象所共有的,每一个构造函数都有一个prototype属性,指向另一个对象,(prototype就是一个对象),这个对象的所有属性和方法,都会被构造函数有拥有.
可以就一些不变的方法直接定义在prototype对象上,这样所有的实列就可以共享这些方法.
二.对象原型:
对象都会有一个属性__proto__指向构造函数的prototype原型对象,我们可以使用构造函数prototype原型对象的属性和方法,就是有__protot__原型的存在.
__proto__ 对象原型和原型对象prototype是等价的
__proto__ === 原型
三.constructor构造函数:
对象原型(__proto__)和构造函数(prototype)原型对象里面都有一个属性constructor属性,我们称之为构造函数,因为它指回构造函数本身.
constructor主要记录该对象引用了那个构造函数,它可以让原型对象重新指向原来的构造函数,
四.构造函数实例和原型对象三角关系:
- 构造函数的prototype属性指向构造函数的原型对象
- 实列对象是由构造函数创建的,实列对象的__proto__属性指向了构造函数的原型对象.
- 构造函数的原型对象的constructor属性指向了构造函数,实列对象的原型的constructor属性也指向了后遭函数.
实例.__proto__ === 原型
原型.constructor === 构造函数
构造函数.prototype === 原型
// 这条线其实是是基于原型进行获取的,可以理解成一条基于原型的映射线
// 例如:
// const o = new Object()
// o.constructor === Object --> true
// o.__proto__ = null;
// o.constructor === Object --> false
// 注意: 其实实例上并不是真正有 constructor 这个指针,它其实是从原型链上获取的
// instance.hasOwnProperty('constructor') === false
实例.constructor === 构造函数
五.原型链和成员的查找机制:
任何对象都有原型对象,也就是prototype属性,任何原型对象也就是一个对象,该对象就有proto属性,所以这样一层层往上找,就形成一条链,我们称为原型链.
-
属性查找机制: 当查找对象的属性时,如果实例对象自身不存在该属性,则沿着原型链往上一级查找,找到时则输出,不存在时,则继续沿着原型链往上一级查找,直至最顶级的原型对象
Object.prototype
,如还是没找到,则输出undefined
; -
属性修改机制: 只会修改实例对象本身的属性,如果不存在,则进行添加该属性,如果需要修改原型的属性时,则可以用:
b.prototype.x = 2
;但是这样会造成所有继承于该对象的实例的属性发生改变。
六.原型对象中的this指向:
不管构造函数中的this还是原型对象的this,都指向我们new出来的实列对象