微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么可以将构造函数原型分配给对象及其含义

如何解决为什么可以将构造函数原型分配给对象及其含义

我正在阅读官方文档:

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.prototype NOT类型的Object.prototype,否则{ {1}}不再是一个函数,而是成为一个对象,或者我想。

谁能解释为什么Graph的{​​{1}}被分配给一个对象,为什么继承prototype的指定行为成为可能?发生这种分配时,我们是否会丢失所有函数属性GraphaddVertex)?

解决方法

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

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

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

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

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

您可能有兴趣在"How does JavaScript .prototype work?"阅读有关原型的更广泛主题的更多信息。这是一本有趣的文章,您还会发现my answer over there

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。