原型与原型链的个人理解

原型

1、每个对象都有着自己的原型

原型与原型链的个人理解_第1张图片

图中obj和info有着自己的隐式原型,而它又指向了各自的原型对象

当进行代码打印的时候,js会先去对象obj或者info去寻找属性,就类似于

console.log(obj.name)    //peter

当js在对象上找不到目标属性时,他就会去对象的原型上寻找属性,而如果在原型上也没有找到的话就输出空值。

console.log(obj.address)    //undefined

原型链

1、在属性的寻找过程当中存在着一条原型链

属性的寻找会沿着这条链一直往上寻找

原型与原型链的个人理解_第2张图片

在这个图当中,info的隐式原型指向了obj对象,而obj的隐式原型又指向了它的原型对象,这就形成了一条原型链

用代码的形式来描述就是:

const obj = {
    age: 18
    name: 'peter'
}

const info = {}

info.__proto__ = obj

而当我们进行属性打印的时候:

console.log(info.name) //peter
console.log(info.age) //18

这个时候我们会发现,在info上不存在name和age这两个属性,但是js会沿着这条原型链去进行寻找,它会在obj中寻找到name和age,就输出了这个结果

2、原型链中存在着一个顶层原型

当我们沿着这个原型链向上去寻找属性的时候,它会存在一个终点,这就是顶层原型,如果在顶层原型中还没有找到目标属性,就会输出空值

我们在平常创建对象的时候,通常使用的是字面量创建,也就是以下写法:

const obj = {}

其实这种方法就是一种语法糖

js内部所进行的其实是这种创建方法:

const obj = new Object()

js内部实质上所进行的创建方式就是利用构造函数进行创建的
这里,我们回顾一下利用构造函数创建对象的内部操作:
(1)创建一个实例对象
(2)把this指向这个实例对象
(3)实例对象的隐式原型__proto__赋值为构造函数的prototype
(4)执行函数当中的代码
(5)将这个实例对象返回

第三步的操作就是改变的实例对象的隐式原型的指向:
原型与原型链的个人理解_第3张图片

所以说obj的隐式原型所指向的原型对象就是顶层原型。

我们讲上面说到的info和obj的图进行补全:

原型与原型链的个人理解_第4张图片

当我们打印info当中的address的时候,js会先去info中寻找,在info中没有找到,就会去到obj当中去寻找,而在obj没有找到,最后就去到顶层原型寻找,没有找到就输出了undefined:

console.log(info.address) //undefined

你可能感兴趣的:(javascript)