删除函数原型对象
Deleting the function.prototype object
在 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
仅对对象的属性有效。它没有效果 变量或函数名称。
当然,如果有意省略var
,z
绑定将被删除 - 因为它实际上不再是一个变量,而是一个全局对象的属性。
你可能会说:'好吧,但是如果我删除SC.prototype
呢?好吧,你不能:prototype
是SC
的不可配置属性(与任何函数一样),因此尝试删除它只会在非严格模式下返回false
。在严格模式下,它会向你抛出异常。
相关文章:
- 重载JS'firefox中的对象原型
- 带有对象/原型的链式承诺(Q延期)
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- 创建后指定对象原型
- javascript对象原型与jquery冲突
- 为什么我要将函数添加到对象原型中,而不是将其添加到对象中
- 基本对象/原型语法问题
- Javascript对象/原型.我的理解错了吗
- ES6 const,用于在JavaScript中创建对象原型;这是一种模式吗
- 在角度表达式中使用对象原型
- 对象原型和继承
- 为什么javascript对象原型被称为“fn”
- Uncaught TypeError:对象原型在Symfony 2中只能是Object或ExtJS为null
- 在Javascript中将对象原型函数绑定到对象
- 对象原型在Canvas Game中不起作用
- 如何获取Javascript对象原型的属性
- 为对象原型提供一个方法,该方法指向对象自身属性的值
- 向对象原型添加命名空间方法
- 在Vanilla Javascript中使用窗体中的对象原型创建多个用户
- Javascript对象原型错误