javascript - 为什么可以将构造函数原型分配给对象及其含义
问题描述
我正在阅读官方文档:
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
Graph
谁能解释为什么将prototype
ofGraph
分配给一个对象以及为什么指定的继承行为addVertex
成为可能?当这样的赋值发生时,我们会失去所有的函数属性(call
, )吗?bind
解决方案
有两种不同的原型链在起作用:
- 构造函数的原型链
- 该构造函数创建的对象原型链
他们彼此没有任何关系。第一个是函数,因此与 相关Function.prototype
,另一个不是函数,而是一个对象,其原型对象与构造函数对象同时创建。当通过使用 调用构造函数创建新实例时,将使用该原型对象new
。
这里可能令人困惑的是,构造函数有一个名为 的属性prototype
,但这不是构造函数的原型对象(第 1 点),而是它可以创建的对象(第 2 点)。可能这个属性会更好地命名prototypeForConstructedInstances
......但这有点长;-)
要获得构造函数自己的原型,您将编写Object.getPrototypeOf(constructor)
...,您会看到它是Function.prototype
。
您可能有兴趣在“JavaScript .prototype 如何工作?”中阅读更多关于原型的更广泛主题的信息。. 这是一本有趣的书,你也会在那里找到我的答案。
推荐阅读
- c++ - c ++构造函数成员初始化:传递参数
- php - MySQLi PHP 结果数组不兼容?
- java - 为 Eclipse Photon 安装 Glassfish 工具时出错
- asp.net - 如何从 ASP.NET 执行 text/nvarchar SQL Server 中的变量
- unity3d - 非玩家对象权限转移问题
- google-cloud-functions - functions.runWith 不是部署时使用firebase云函数的函数
- applicationcontext - 使用 ApplicationContext 在 smali 文件中调用方法
- python - Xpath。按页面出现顺序获取指定标签的文本
- javascript - AngularFire FirebaseStorage 回调不能从快照方法工作
- c# - 在monogame屏幕分辨率和交叉点上需要帮助