为什么构造函数原型可以分配给对象,以及它的含义



我正在阅读官方文档:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

并且在章节CCD_ 1->With a constructor他们有以下几种:

function Graph() {
this.vertices = [];
this.edges = [];
}
Graph.prototype = {
addVertex: function(v) {
this.vertices.push(v);
}
};
var g = new Graph();
// g is an object with own properties 'vertices' and 'edges'.
// g.[[Prototype]] is the value of Graph.prototype when new Graph() is executed.

但就在那之前,它写着:

// Functions inherit from Function.prototype 
// (which has methods call, bind, etc.)
// f ---> Function.prototype ---> Object.prototype ---> null

因此,Graph是一个函数,在我的理解中,它应该有Graph.prototype,类型为Function.prototypeNOTObject.prototype,否则Graph将不再是函数,而是变成一个对象,或者我认为是这样。

有人能解释为什么Different ways to create objects and the resulting prototype chain0的prototype被分配给一个对象,以及为什么继承addVertex的指定行为成为可能吗?当这样的赋值发生时,我们会失去所有的函数属性(callbind(吗?

有两个不同的原型链在发挥作用:

  1. 构造函数的原型链
  2. 由该构造函数创建的对象的原型链

他们彼此无关。第一个是函数,因此与Function.prototype有关,另一个不是函数,而是一个对象,其原型对象是在创建构造函数函数对象的同时创建的。当使用new调用构造函数创建新实例时,将使用该原型对象。

这里可能令人困惑的是,构造函数有一个称为prototype的属性,但这不是构造函数的原型对象(第1点(,而是它可以创建的对象(第2点(。可能这个属性最好命名为prototypeForConstructedInstances。。。但有点长;-(

要获得构造函数自己的原型,您需要编写Object.getPrototypeOf(constructor),。。。你会看到它是Function.prototype

您可能有兴趣在";JavaScript.protype是如何工作的&";。这是一本有趣的读物,你也可以在那里找到我的答案。

最新更新