首页 > 解决方案 > 为什么可以将构造函数原型分配给对象及其含义

问题描述

我正在阅读官方文档:

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

并且在章节中Different ways to create objects and the resulting prototype chain- >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.prototypeFunction.prototypeNOT Object.prototypeGraph

谁能解释为什么将prototypeofGraph分配给一个对象以及为什么指定的继承行为addVertex成为可能?当这样的赋值发生时,我们会失去所有的函数属性(call, )吗?bind

标签: javascriptprototype

解决方案


有两种不同的原型链在起作用:

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

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

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

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

您可能有兴趣在“JavaScript .prototype 如何工作?”中阅读更多关于原型的更广泛主题的信息。. 这是一本有趣的书,你也会在那里找到我的答案


推荐阅读