在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对象仍然不受影响(它存在)。为什么不修改/删除?
答案 0 :(得分:1)
因为使用delete something
,您只需擦除名为something
的绑定 - 而不是对象本身。引用文档(MDN):
严重来说,对于与普通信念所暗示的不同,
delete
运营商什么都没有 与直接释放内存有关(它只能间接地通过 打破参考)。
delete z
z
定义为变量(即var z
),delete
将不会产生这种效果:
var
仅对对象的属性有效。它没有效果 关于变量或函数名称。
当然,如果省略z
这里是故意的,SC.prototype
绑定将被删除 - 因为它实际上不再是变量,而是全局对象的属性。
您可能会说:“好的,但如果我删除prototype
会怎么样?”好吧,您不能:SC
是false
的不可配置属性(对于任何函数),因此尝试删除它只会在非严格模式下返回{{1}}。在严格模式下,它会向你抛出异常。
答案 1 :(得分:1)
delete
对象引用不会触及对象本身;它只是清除了参考。如果没有其他引用,那么该对象将被垃圾收集。
由于SC.prototype
保留了对该对象的引用,delete
z
{{1}}实际上并未删除该对象。