以两种方式删除属性,但只有一种有效

Deleting properties in two ways, but only one works

delete 从某个对象中删除 属性。

function Man() {
  this.eye = 2;
  this.mouth = 1;
}
Man.prototype.walk = function (arguments) {
  console.log("Im walking.");
}

var man1 = new Man();
var man2 = new Man();

delete man1.constructor;
console.log(man1.constructor); // function Man()

在那里,当然,我要删除 man1 原型的 属性,即 constructor 属性。好吧,至少那是我的意图。但是当我登录时,我仍然得到构造函数。

不过,这个问题在

delete man1.constructor.prototype.constructor;
console.log(man1.constructor);  // function Object()

现在我得到的是空对象。我应该这样做。

我的问题是:为什么第二个解决方案有效而第一个无效?是因为委托吗?我听说有效的 delete man1.constructor.prototype.constructor; 使用 "implicit" 参考。那是什么意思?还有一件事。为什么我仍然是空的 Object 并且没有空闲内存?

Why you get the constructor again ?

因为delete只适用于对象的direct/own属性,但是你的Man没有direct/own 属性 姓名 constructorconstructor 位于来自 Man.prototypeMan 的原型链中。当您访问那个 属性 时,它会从原型链中获取它。

所以从这里你也可以推断出原型链中的属性只能读取,不能修改。如果要修改,需要直接访问。

However, this problem is fixed when

在这种情况下,您实际上访问了原始对象并将其从该对象中删除。对于那个对象 constructor 是一个 direct/own 属性.