初始知识点
prototype与constructor
构造函数与它的原型对象有相互引用的关系
什么是相互引用?
构造函数中有属性prototype可以找到原型对象,原型对象中有属性constructor可以找到构造函数。
prototype与__proto__
对象的隐式原型的值为其构造函数的显式原型的值
- 函数的prototype属性:在定义函数时自动添加的,默认值是一个空Object对象。
- 对象的__proto__属性:创建对象时自动添加的,默认值为构造函数的prototype属性值。
function Fn() {}
console.log(Fn.prototype)
var fn = new Fn()
console.log(fn.__proto__)
console.log(fn.__proto__ === Fn.prototype) //true
原型的属性与方法
- 读取对象的属性时:会自动在原型链中查找
- 设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
- 方法一般定义在原型中,属性一般通过构造函数定义在对象本身上
(隐式)原型链
- 原型链又名(隐式原型链),它的作用是查找对象属性(方法)
(原型链查找对象属性、作用域链查找变量) - 访问一个对象的属性时:
- 先在自身属性中查找,找到返回
- 如果没有,再沿__proto__这条链向上查找,找到返回
- 如果最终没钟爱到,返回undefined
图解原型链
如上图所示是关于原型链的图解,我将按照图示的顺序来对原型链进行理解
- JS引擎在加载页面时首先会把内置的一些函数加载进来,接着再去执行代码。而Object即为其中的一个内置对象。
此时序号1虚线意思的:o1和o2为Object的两个实例对象,对象的隐式原型的值为其构造函数显式原型的值。 - 所有的函数都是Function的实例,包括Function自己也是自己的实例。即所有函数的__proto__都是一样的,都等于Function.prototype。
var Foo = new Function()
console.log(Foo.__proto__ === Function.prototype) //true
- 函数的显式原型指向的对象默认是空Object实例对象,但Object的显式原型不满足。
function Fn() {}
console.log(Fn.prototype.__proto__ === Object.prototype) //true
- Object的原型对象是原型链尽头
console.log(Object.prototype.__proto__) //null
若有错误欢迎指正!