前端-原型与原型链

一、什么是原型?

每一个javascript函数都会有一个prototype属性,这个prototype指向的对象是原型对象。

这个原型对象是可以被调用构造函数创建的实例所共享。

比如

function Target() {
}

Target.prototype.name = "hi"

let target_first  = new Target()
let target_second = new Target()

console.log(target_first.name)  // 输出 hi
console.log(target_second.name)  // 输出 hi

二、 什么是构造函数?

构造函数其实是一个普通函数,创建方式和普通方式没什么区别,但它的本质是初始化对象,要和关键字 new 一起使用进行创建对象,构造函数可以给对象添加属性和方法。

//构造函数
function Target(age) {
    this.age  = age
}

let target_first = new Target(18)

console.log(target_first.age)  // 输出 18

每个原型对象都会有一个constructor属性,指向该关联的构造函数。

图1表示构造函数和实例原型关系:

前端-原型与原型链_第1张图片

                                                                  图1

三、什么是原型链?

 首先得介绍一下__proto__这个属性,每个创建出来的对象都会拥有这个属性,这个属性会指向该对象的原型对象。

图2表示属性__proto__的关系图:

前端-原型与原型链_第2张图片

图2

 我的理解是原型链是表示实例对象与原型对象之间的关系,就比如实例target通过属性__proto__指向原型对象Target.prototype,原型对象Target.prototype的属性__proto__指向Object原型对象Object.prototype,从而形成一条原型指向的链条。图3表示原型链关系图。

前端-原型与原型链_第3张图片

图3

Object是JS中所有对象数据类型的基类(最顶层的类),所以Object.prototype上没有__proto__这个属性

console.log(Object.prototype.__proto__) // 输出 null

 原型链查找方式:

当我们访问实例对象的一个属性或者方法时,先从该实例对象去寻找,如果有就直接使用,如果没有的话,继续到原型对象去寻找,直到找到Object的原型对象,如果Object的原型对象还是没有的话,就返回undefined。

这是我对原型与原型链的初步认识。

你可能感兴趣的:(前端,javascript,html)