javascript - 实例的 [[prototype]] 插槽如何以及为什么在它们被制作的时间点包含 Constructor.prototype(并且没有得到“更新”)?
问题描述
如果您更改Constructor.prototype
,Constructor
您在更改之前所做的实例将“存储”旧的实例Constructor.prototype
在他们的[[prototype]]
插槽中。
function F() {
}
o1 = new F();
F.prototype = {color: "red"};
o2 = new F();
console.log(o1) //it's [[proto]] contains old Object.prototype.
console.log(o2) //it's [[proto]] contains {color: "red"}.
我的印象是[[prototype]]
插槽引用Object.prototype
。它如何捕捉旧的Object.prototype
?
解决方案
插槽没有什么神奇之处[[proto]]
,它就像任何其他对象属性一样,它可以包含对对象的引用。它不直接链接到F.prototype
插槽,它只是在创建对象时获取对该插槽的值的引用。
因此,重新分配F.prototype
插槽对原型对象的其他引用没有影响,就像任何其他对象属性一样:
o1 = { prop1: {a: 1}}
o2 = { prop1: o1.prop1 }
console.log(o2.prop1.a) // prints 1
o1.prop1 = {a: 2}
console.log(o2.prop1.a) // still prints 1
这就是为什么我们F.prototype
在创建类的实例后通常不重新签名的原因。相反,我们分配给 ; 的属性F.prototype
。因为所有的实例都引用了这个对象,所以修改它会影响所有的实例。
所以在你的例子中你会这样做:
F.prototype.color = "red";
推荐阅读
- csv - 'b' 尝试在 Jupyter 中加载数据文件时添加到文件名
- python - Python Pandas 样式根据列中的值更改整行的背景颜色
- azure-logic-apps - 在 Azure 数据工厂中使用 Web 活动触发邮件时出错
- reactjs - 如果我们在 React 中有两个 Counter 组件,我们是否必须复制 Counter 代码?
- c# - C# string.LastIndexOf 是否总是特定于文化?
- tfs - 使用 TFS 2018 更新 3.2 构建/发布 .NET Core 3.x 应用程序
- python - 为什么这个程序没有写最后一个打印语句就关闭了?
- http - 为什么有些网站的地址栏中包含“www-alt”而不是“www”?
- typescript - NestJs 在使用来自其他模块的枚举时尝试解决依赖关系
- sql - 我怎样才能计算得到某物的数量