JavaScript原型和内存

javascript prototypes and memory

本文关键字:内存 原型 JavaScript      更新时间:2023-09-26

我正在参加一个新兵训练营,今天在课堂上发表了以下声明:

"一般来说,在使用构造函数时,如果你希望每个对象都能够访问一个函数,请将该函数放在原型中,而不是放在原始构造函数中。这将节省内存,因为不是在每次调用对象时创建一个新函数,而是每个对象在使用该函数时都会简单地引用原型。

任何人都可以解释/验证吗?

"一般来说,在使用构造函数时,如果你要 希望每个对象都有权访问一个函数,将该函数放入 原型,而不是在原始构造函数中。这 将节省内存,因为而不是在每个 调用对象时,每个对象将简单地引用 使用该功能时的原型。

这句话说得对。

prototype的一个重要特征是,它是在该类型对象的所有实例之间共享的单个对象。

因此,放在原型上的任何方法都在该类型对象的所有实例之间共享。 单个原型对象的这种"共享"是一种内存高效方式,所有对象都可以访问一组通用的方法/属性。

如果像这样初始化构造函数中的方法:

function MyConstructor() {
    this.print = function() {
        // code here
    }
}

然后,每次调用构造函数(对象的每个新实例)时,都会创建一个新的函数对象并分配一个新的 own 属性,这确实会占用更多内存。


现在,使用更多内存是否真的相关是一个单独的问题。 它不会使用更多的内存,除非你有很多这些类型的对象。

有些人(例如道格拉斯·克罗克福德)提倡一种不使用原型的特定对象定义编码方法,他认为额外使用内存与他的方法的好处无关紧要。 由于 ES6 中的新"类"语法仍在使用原型(在幕后),因此他的观点似乎并未被那些指导该语言未来的人所接受。

如果你想要只有实例的某些方法可以访问而不能从外部世界访问的"私有"成员变量,那么你可能需要将这些成员变量声明为构造函数中的局部变量,并分配您希望能够访问构造函数内那些"私有"成员变量的任何方法(你不能把它们放在原型上)。 你可以在这里看到Crockford关于如何制作"私有"实例变量的文章。 这在变量的隐私(有时是安全性)很重要的某些情况下非常有用。

有关Crockford对原型的一些看法,请观看此视频(转到视频中的31:30点,然后转到36:00点)。