问题描述
我正在阅读官方文档:
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.prototype
和Function.prototype
NOT
类型的Object.prototype
,否则{ {1}}不再是一个函数,而是成为一个对象,或者我想。
谁能解释为什么Graph
的{{1}}被分配给一个对象,为什么继承prototype
的指定行为成为可能?发生这种分配时,我们是否会丢失所有函数属性(Graph
,addVertex
)?
解决方法
有两个不同原型链在起作用:
- 构造函数的原型链
- 由该构造函数创建的对象原型链
他们彼此无关。第一个是函数,因此与Function.prototype
相关,另一个不是函数,而是一个对象,该对象的原型对象与创建构造函数的对象同时创建。通过用new
调用构造函数来创建新实例时,将使用该原型对象。
这里令人困惑的是,构造函数具有一个称为prototype
的属性,但这不是构造函数的原型对象(第1点),而是对象的原型它可以创建(第2点)。可能最好将此属性命名为prototypeForConstructedInstances
...但这有点长;-)
要获得构造函数自己的原型,您可以编写Object.getPrototypeOf(constructor)
,...,然后您会看到它是Function.prototype
。
您可能有兴趣在"How does JavaScript .prototype work?"阅读有关原型的更广泛主题的更多信息。这是一本有趣的文章,您还会发现my answer over there。