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

时间:2018-02-27 05:06:40

标签: javascript ecmascript-3

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

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;使用“隐式”引用。那是什么意思?还有一件事。为什么我仍然变空Object并且没有空闲记忆?

1 个答案:

答案 0 :(得分:2)

  

为什么再次获得构造函数?

由于delete仅适用于对象的直接/拥有属性,但您的Man没有直接/拥有属性名称为constructorconstructor位于Man的原型链中,来自Man.prototype。当您访问该属性时,它就会从原型链中获取它。

因此,从这里您还可以推断原型链中的属性只能被读取,而不能被修改。如果要修改,则需要直接访问。

  

但是,

时会解决此问题

在这种情况下,您实际访问了原始对象并从该对象中删除它。对于该对象,constructor直接/拥有属性。