0

在 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”中也是可见的,这与 book 一致。但是如果我 'delete z' ,那么 SC.prototype 对象仍然不受影响(它存在)。为什么它没有被修改/删除?

4

2 回答 2

1

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

与普遍看法不同,delete操作符与直接释放内存无关(它只是通过破坏引用间接地)。

顺便说一句,严格来说,delete zforz定义为变量(即 with var z)甚至不会产生这种效果:

delete仅对对象的属性有效。它对变量或函数名称没有影响。

当然,如果var有意省略这里,z绑定将被移除——因为它实际上不再是一个变量,而是一个全局对象的属性。


你可能会说:“好吧,但是如果我删除SC.prototype了呢?” 好吧,您不能:prototypeSC(对于任何函数)的不可配置属性,因此尝试删除它只会false以非严格模式返回。在严格模式下,它会向您抛出异常。

于 2013-09-08T21:19:01.790 回答
1

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

由于SC.prototype保留了对该对象的引用,因此deleteingz实际上并没有删除该对象。

于 2013-09-08T21:19:12.427 回答