【问题标题】:Javascript Prototype Inheritance and Object.create()?Javascript 原型继承和 Object.create()?
【发布时间】:2016-12-24 10:29:03
【问题描述】:

关于 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 print 1)。除此之外的机制是什么?

【问题讨论】:

  • b 被复制到了 obj 的原型中,所以你不再需要 a...

标签: javascript prototype


【解决方案1】:

从技术上讲,当您用另一个新值替换一个对象时,该对象的旧引用将从变量中删除。但它仍然存在,直到链接变量死亡。

var x = { a:10 }
var y = { x };
x = 10;

现在,每个人都会认为,y 将带有属性x 的值 10。但事实并非如此,正如我在上面所说的那样,x 的旧内存位置将保持活动状态,直到 y 垃圾收集。同时,x 将被分配新的内存位置以获取新的值。

因此,在您的情况下,您只是通过替换一些其他值而丢失了 a 的引用。因此,在替换 a 的值后,您不能在任何地方使用 isPrototypeOf(obj)

【讨论】:

  • 感谢您的回复。那么我们怎样才能删除'a'属性呢?如果我们在您的示例中使用“删除 y.a”,它将什么也不做,因为“a”不是 y 自己的属性。
  • @msecz 显然,它不会删除它。因为y.a 将是未定义的。我们可以通过delete y.x.a删除它
  • 当我尝试得到“无法将未定义或 null 转换为对象”时 - 我想是因为 x 不再是对 y 的真正引用
猜你喜欢
  • 1970-01-01
  • 2013-02-09
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多