JavaScript原型、原型链、作用域链

257 阅读2分钟

一、原型和原型对象的关系

在JavaScript中函数也是一个特殊的对象,它同样拥有属性和值,所有的函数都有一个特殊的属性prototype,该属性的值是一个对象,这个对象就是我们常说的“原型对象”。原型对象有两个属性:constructor和__proto__

函数的原型对象prototype有以下几个特点:

1.默认情况下,所有函数的原型对象都拥有constructor属性,该属性指向与之关联的构造函数

2.函数的原型对象同样拥有自己的原型对象,用__proto__属性表示

3.使用构造函数可以创建对象,创建的对象称为实例对象。实例对象通过__proto__指向构造函数的原型对象,实现了该原型对象的继承

4.每个对象都有__proto__属性来表示自己所继承的原型对象,但只有函数才有prototype属性

二、通过原型链访问对象的属性和方法

在JavaScript试图访问一个对象的属性时,会基于原型链进行查找,查找过程是这样的:

1.首先会优先在该对象上查找。如果找不到,会依次层层向上搜索该对象的原型对象、该对象的原型对象的原型对象......

2.在JavaScript中所有的对象都来自Object,Object.prototype.proto = null。null没有原型,并作为这个原型链中的最后一个环节

3.JavaScript会遍历访问对象的整个原型链,如果最终依然找不到,此时会认为该对象的属性值为undefined

三、作用域链

在JavaScript中,作用域分为全局作用域和局部作用域

变量在取值的时候,会在创建这个变量的函数作用域中查找,如果找不到就会向上级作用域去查找,直到查到全局作用域

四、原型链和作用域链的区别

1.作用域链是相对变量而言,原型链是相对于对象的属性而言; 2.作用域链的最顶层是window,原型链的最顶层是object