Javascript类静态方法内存消耗

Javascript class static methods memory consumption

本文关键字:内存 静态方法 Javascript      更新时间:2023-09-26

您好,我知道原型只定义一次,并且对于所有对象实例都是通用的,但是每个对象实例都绑定到所创建的新实例的上下文中。我也知道,与在构造函数中使用this定义的方法相比,它可以节省内存:

function Person(name) {
    this.name = name;
    // each instance will have it's own talk method
    // so 500 * person instances = 500 * this.talk in memory
    this.talk = function(str) {
        console.log(this.name,"said",str);
    };
}
// 500 * person instances = 1 instance of talk2 in memory
Person.prototype.talk2 = function(str) {
    console.log(this.name,"said",str);
};

但是我不确定静态方法和内存消耗。

// 500 * person instances = x * talk3 in memory ?
Person.talk3 = function(str) {
    // code
};

它们是否像原型?

无论您创建多少个Person实例,都只有一个Person.talk3函数。


旁注:您关于talktalk2的评论在创建函数对象的数量方面都是正确的。现代 JavaScript 引擎可能会在为其创建的 500 个函数对象中的每个对象中重用 talk 中的代码(如果有很多代码,这可能是相关的),但这是一个实现/优化细节。

它们只是像原型一样,因为它们被分配一次。除此之外,它们不会以任何方式在实例上共享或可用。

此外,像示例中Person.talk3这样的"静态"方法在调用时会将Person函数本身作为上下文对象(" this ")。除非您在静态方法中实际引用this,否则Person.talk3将与常规函数完全相同,例如 function personTalk () {...} .

var p = new Person;
p.talk3(); // TypeError

talk3Person 的实例上不存在。它只作为构造函数的属性存在一次