JavaScript原型继承和Object.create()是什么?

4

我很困惑JS中的原型。

假设我有这样一个对象:

let a = {
  b: 1
};

现在,我想创建另一个对象,该对象继承了“a”的属性。

let obj = Object.create(a);

在这种情况下,我将连接“obj”的proto到“a”的proto,它将连接到Object.prototype。第一个问题是,这是否会删除obj.proto的链接以替换为a.proto
现在假设我执行以下操作:

a = 2;

我认为它会更新内存中的'a'并删除它的引用。
所以现在如果我执行:

a.isPrototypeOf(obj)

逻辑上它会返回false。但奇怪的是,'obj'仍然指向属性b并且可以访问它(obj.b打印1)。背后的机制是什么?


b已经被复制到obj的原型中,因此你不再需要a了... - Jonas Wilms
1个回答

0
从技术上讲,当您用另一个新值替换对象时,该对象的旧引用将从变量中断开。但是,它仍然存在,直到链接的变量死亡。
var x = { a:10 }
var y = { x };
x = 10;

现在,大家可能会认为,y将使用属性x的值10。但实际上并不是这样的,就像我上面说的那样,x的旧内存位置将一直保持活动状态,直到y被垃圾回收。同时,x将获得新的内存位置来存储新值。

所以在你的情况下,你只是通过替换其他值而失去了对a的引用。因此,在替换a的值之后,你不能在任何地方使用isPrototypeOf(obj)。


谢谢您的回复。那么我们如何删除 'a' 属性呢?如果在您的示例中使用 "delete y.a",它将无效,因为 'a' 不是 y 的自有属性。 - musecz
@musecz 显然,它不会删除那个。因为 y.a 将是未定义的。我们可以通过 delete y.x.a 来删除它。 - Rajaprabhu Aravindasamy
当我尝试这样做时,我得到了“无法将未定义或空值转换为对象”的错误 - 我想是因为x不再是对y的真实引用。 - musecz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接