删除function.prototype对象

时间:2013-09-08 21:16:30

标签: javascript inheritance prototype

在Javascript中:道格拉斯·克罗克福德(Douglas Crockford)在3.4参考文献中提到的好部分,它说: 对象通过引用传递。它们永远不会被复制,所以

a = b = c = {}; // a, b, and c all refer to the same empty object

按照相同的行,假设我有一个父类P,并且我在子类SC中继承它,就像这样,

var P = function (){};

var SC = function (){};

SC.prototype = z = new P();

现在,无论我在SC.prototype中做出什么变化,同样在'z'中都可见,这与书一致。 但是如果我'删除z',那么SC.prototype对象仍然不受影响(它存在)。为什么不修改/删除?

2 个答案:

答案 0 :(得分:1)

因为使用delete something,您只需擦除名为something的绑定 - 而不是对象本身。引用文档(MDN):

  

与普通信念所暗示的不同,delete运营商什么都没有   与直接释放内存有关(它只能间接地通过   打破参考)。

严重来说,对于delete z z定义为变量(即var z),delete将不会产生这种效果:

  

var仅对对象的属性有效。它没有效果   关于变量或函数名称。

当然,如果省略z这里是故意的,SC.prototype绑定将被删除 - 因为它实际上不再是变量,而是全局对象的属性。


您可能会说:“好的,但如果我删除prototype会怎么样?”好吧,您不能:SCfalse的不可配置属性(对于任何函数),因此尝试删除它只会在非严格模式下返回{{1}}。在严格模式下,它会向你抛出异常。

答案 1 :(得分:1)

delete对象引用不会触及对象本身;它只是清除了参考。如果没有其他引用,那么该对象将被垃圾收集

由于SC.prototype保留了对该对象的引用,delete z {{1}}实际上并未删除该对象。