删除函数原型对象

Deleting the function.prototype object

本文关键字:对象 原型 函数 删除      更新时间:2023-09-26

在 Javascript: the Good Parts by 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对象仍然不受影响(它存在)。为什么它没有被修改/删除?

delete对象

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

由于SC.prototype保留对该对象的引用,因此delete z实际上不会删除该对象。

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

与通常的信念不同,delete运算符一无所有 与直接释放内存有关(它仅通过间接释放 中断引用)。

顺便说一句,严格来说,delete z 对于定义为变量(即var z)的z甚至不会有这种效果:

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

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

<小时 />

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