JavaScript原型和内存
javascript prototypes and memory
我正在参加一个新兵训练营,今天在课堂上发表了以下声明:
"一般来说,在使用构造函数时,如果你希望每个对象都能够访问一个函数,请将该函数放在原型中,而不是放在原始构造函数中。这将节省内存,因为不是在每次调用对象时创建一个新函数,而是每个对象在使用该函数时都会简单地引用原型。
任何人都可以解释/验证吗?
"一般来说,在使用构造函数时,如果你要 希望每个对象都有权访问一个函数,将该函数放入 原型,而不是在原始构造函数中。这 将节省内存,因为而不是在每个 调用对象时,每个对象将简单地引用 使用该功能时的原型。
这句话说得对。
prototype
的一个重要特征是,它是在该类型对象的所有实例之间共享的单个对象。
因此,放在原型上的任何方法都在该类型对象的所有实例之间共享。 单个原型对象的这种"共享"是一种内存高效方式,所有对象都可以访问一组通用的方法/属性。
如果像这样初始化构造函数中的方法:
function MyConstructor() {
this.print = function() {
// code here
}
}
然后,每次调用构造函数(对象的每个新实例)时,都会创建一个新的函数对象并分配一个新的 own 属性,这确实会占用更多内存。
现在,使用更多内存是否真的相关是一个单独的问题。 它不会使用更多的内存,除非你有很多这些类型的对象。
有些人(例如道格拉斯·克罗克福德)提倡一种不使用原型的特定对象定义编码方法,他认为额外使用内存与他的方法的好处无关紧要。 由于 ES6 中的新"类"语法仍在使用原型(在幕后),因此他的观点似乎并未被那些指导该语言未来的人所接受。
如果你想要只有实例的某些方法可以访问而不能从外部世界访问的"私有"成员变量,那么你可能需要将这些成员变量声明为构造函数中的局部变量,并分配您希望能够访问构造函数内那些"私有"成员变量的任何方法(你不能把它们放在原型上)。 你可以在这里看到Crockford关于如何制作"私有"实例变量的文章。 这在变量的隐私(有时是安全性)很重要的某些情况下非常有用。
有关Crockford对原型的一些看法,请观看此视频(转到视频中的31:30点,然后转到36:00点)。
- 使用“;这个“;JavaScript原型方法中的关键字
- 引用类变量中的原型方法
- 如何从对象的原型方法访问JavaScript对象属性
- 为什么要包装每一个原型“;类“;JS中具有匿名函数的对象
- Node.js中的JavaScript原型对象效率
- 重载JS'firefox中的对象原型
- “util.inherits”和在NodeJS中扩展原型之间的区别
- 附加到原型属性的Do函数没有闭包
- 使用方括号访问插件原型函数
- 为什么JSON.stringify没有序列化原型值
- 为什么要返回'这'在导致循环的JavaScript原型中
- 带有对象/原型的链式承诺(Q延期)
- 如何覆盖原型中的事件侦听器
- 如何在Mocha/Chai中测试JS原型(非模块)
- 我将如何将Base的原型分配给User
- 在构造函数中定义函数会比将其附加到原型消耗更多的内存
- JavaScript原型和内存
- 对象文字符号与原型速度和内存
- Javascript原型与$.扩展内存之谜
- 原型属性在内存中的工作方式