在了解原型和原型链之前,我们先要了解对象的概念
JS 对象是什么?
在 JavaScript 中,对象是一种数据类型,用于表示一组相关的数据和行为。它由键值对组成,键是字符串,值可以是任何 JavaScript 类型(包括其他对象)。每一个对象(函数也是对象)都有一个特殊的属性叫做原型(prototype),它指向另一个对象,这个对象(Test.prototype)被称为原型对象, 原型对象是用来共享属性和方法的
对象的特点:
- 属性: 对象的键值对称为属性。属性可以包含任何 JavaScript 类型的数据。
- 方法: 对象也可以包含方法,即与对象关联的函数,可用来执行特定操作。
- 原型: 每个对象都有一个原型,它是一个指向另一个对象的指针。原型包含对象所有属性和方法的默认值。
- 继承: 对象可以从其他对象继承属性和方法,从而创建子对象。
在js中,函数也是一个特殊的对象
上面提到原型的定义,每个对象都有一个原型,它是一个指向另一个对象的指针。
原型包括显式原型和隐式原型
prototype:显式原型
每个函数都有一个 prototype(显式原型)属性,都默认指向一个空的 Object 对象(全名:Object 构造函数的实例对象。这个对象并非是全空的一个对象,其内部有两个默认携带的属性(方法):__proto__、constructor。在被创建时就携带着这两个属性。我们所指的空,是指除了这两个属性外,没有我们创建的任何属性)。
如果创建一个函数
function Test(name, age){
this.name = name
this.age = age
}
此时显式原型的constructor属性指向的是构造函数本身(Test)
Test.prototype.constructor === Test // true
__proto__:隐式原型
每个对象都有一个 __proto__ 属性。对象的隐式原型属性的值对应 “生成它的构造函数” 的显式原型的值,都指向构造函数的原型:空的 Object 对象。
原型链
1,每个对象均存在隐式原型(__proto__),函数对象才有prototype属性
2,__proto__存在的意义在于为原型链查找提供方向,原型链查找靠的是__proto__,而不是prototype
3,函数对象的__proto__都指向Function.prototype
4,每个对象都有一个隐式原型属性(__proto__),多个原型通过__proto__链接在一起形成的链式结构就是原型链