原型构造函数链有多长?

How long is the prototype constructor chain?

我正在阅读 Mozilla 对原型继承的解释 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain。想在 chrome 控制台中尝试一些示例。

function f() {
 this.a =1; 
 this.b =2;  
}
let o = new f();
f.prototype.b =3;
f.prototype.c =4;

我注意到函数 f() 的原型有一个构造函数,它也有一个原型,它继续如下所示: f.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor

现在根据 mozilla 文档“每个对象都有一个私有的 属性,它持有另一个对象的 link,称为它的原型。那个原型对象有它自己的原型,等等直到到达一个以null为原型的对象。根据定义,null没有原型,在这个原型链中充当最后的link

我确定我看错了角度。有人可以在这里提出一些观点。究竟是怎么回事?为什么我们有一个无休止的构造函数和原型链?

你有一个循环引用。给定一个函数,您可以访问它的 prototype 属性 以获取将成为任何实例的 内部原型 的对象。

function f() {
  this.a =1; 
  this.b =2;  
}
let o = new f();

console.log(f.prototype === Object.getPrototypeOf(o));

在这个 .prototype 对象上,您可以访问它的 constructor 属性 以返回关联的函数。

函数的 .prototype 和原型的 .constructor 是相互链接的。给出其中一个,您可以访问另一个。

f 的实际 原型链是:

f <- Function.prototype <- Object.prototype

o的原型链是:

o <- f.prototype <- Object.prototype

请注意 .prototype 属性 而不是 引用的对象是您正在调用它的对象的内部原型。要获得某些对象 obj 的内部原型,您必须使用 Object.getPrototypeOf(或 __proto__,已弃用)。 .prototype 属性 是 函数 的特殊 属性 ,它将引用可能创建的该函数的任何实例的内部原型。例如 const instance = new SomeClass() 将导致 instance 具有 SomeClass.prototype.

的内部原型