一、什么是原型?
每一个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
三、什么是原型链?
首先得介绍一下__proto__这个属性,每个创建出来的对象都会拥有这个属性,这个属性会指向该对象的原型对象。
图2表示属性__proto__的关系图:
图2
我的理解是原型链是表示实例对象与原型对象之间的关系,就比如实例target通过属性__proto__指向原型对象Target.prototype,原型对象Target.prototype的属性__proto__指向Object原型对象Object.prototype,从而形成一条原型指向的链条。图3表示原型链关系图。
图3
Object是JS中所有对象数据类型的基类(最顶层的类),所以Object.prototype上没有__proto__这个属性
console.log(Object.prototype.__proto__) // 输出 null
原型链查找方式:
当我们访问实例对象的一个属性或者方法时,先从该实例对象去寻找,如果有就直接使用,如果没有的话,继续到原型对象去寻找,直到找到Object的原型对象,如果Object的原型对象还是没有的话,就返回undefined。
这是我对原型与原型链的初步认识。