javascript原型和内存

时间:2016-01-27 02:21:52

标签: javascript constructor prototype

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

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

有人可以解释/验证吗?

1 个答案:

答案 0 :(得分:1)

  

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

这种说法是对的。

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

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

如果在构造函数中初始化方法如下:

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

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

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

有一些人(道格拉斯·克罗克福德,一个人)提倡一种不使用原型的编码对象定义的特定方法,他认为额外使用内存与他的方法的好处无关紧要。自从新的"班级" ES6中的语法仍在使用原型(在封面下),看来他的观点还没有被那些指导语言未来的人接受。

如果你想要"私人"只有实例的某些方法可以访问且无法从外部访问的成员变量,那么您可能希望在构造函数中将这些成员变量声明为局部变量,并指定您希望能够访问这些变量的任何方法。 #34;私人"构造函数中的成员变量(您不能将它们放在原型上)。你可以看到Crockford关于如何制作私人" his writeup here中的实例变量。在变量的隐私(或有时是安全性)很重要的某些情况下,这非常有用。

对于Crockford对原型的一些看法,请参阅this video(转到视频中的31:30点,然后再转到36:00点)。