原型及原型链含义--所有的函数都是 Function 的实例

在这里插入图片描述

  • 每个构造函数都有一个原型对象,该原型对象有一个属性(constructor)指回构造函数,而实例有一个内部指针__proto__([[Prototype]]) 指向原型(即:蓝色 1)。实例与构造函数的原型之间有直接关系,实例与构造函数之间没有。
  • 所有的函数(js中函数也是对象)都是 Function 的实例.所以函数都有一个属性__proto__指向Function的原型对象(即:红色3)
  • Object 是 Function 的实例对象, Object.proto === Function.prototype // true(因为函数 function Object(){} 也是Funciton (){}的实例 。
  • 所有构造函数的的 prototype 方法的 proto 都指向 Object.prototype (除了 Object.prototype 自身)(即:蓝色2)
  • Function.prototype 是 Object 的实例对象。Function.prototype.proto === Object.prototype // true (即:红色4)

原型链的基本思想:

上面如果原型是另一个类型的实例呢?意味着这个原型本身有一个内部指针指向另一个原型,相应的另一个原型也有一个指针(constructor)指向另一个构造函数。这样就在实例和原型之间构造了一条原型链.原型链还有一环,所有引用类型都继承Object,任何函数的默认原型都是一个Object实例,这就意味着这个实例有一个内部指针指向object.prototype.

练习题:

Function.prototype.a = () => {
console.log(1);
}
Object.prototype.b = () => {
console.log(2);
}
function A() {}
const a = new A();
a.a();  //没有这个属性
a.b();  //2
A.a() //1

a.a(); //没有这个属性:

//因为a是实例,它的原型即__proto__ 为 A的原型对象即:A.prototype 然后A的原型的原型对象为对象的原型 即Object.prototype

a.b(); //2

//因为a是实例,它的原型即__proto__ 为 A的原型对象即:A.prototype 然后A的原型对象的原型对象为对象的原型 即Object.prototype 这个Object.prototype有属性b

A.a() //1

所有的函数都是 Function 的实例,即Function(){} ,它有一个属性a

拓展提问:下面打印什么
console.log(a.proto.proto.constructor.constructor.constructor);

答案:Function(){}

a是实例,它的原型即__proto__ 为 A的原型对象即:A.prototype
然后A的原型对象(即:A.prototype )的原型对象为对象的原型 即Object.prototype
Object.prototype的constructor 为function Objec(){}
所有的函数都是 Function 的实例,所以他的__proto__为Funciton.prototype
Funciton.prototype的constructor为Function(){} 即为答案 后面继续加constructor还是Function(){}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HZ___ZH/article/details/115109940