Javascript类静态方法内存消耗

Javascript类静态方法内存消耗,javascript,Javascript,您好我知道原型只定义一次,对所有对象实例都是通用的,但是每个原型都绑定到新创建的实例的上下文中。我还知道,与构造函数中使用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

您好我知道原型只定义一次,对所有对象实例都是通用的,但是每个原型都绑定到新创建的实例的上下文中。我还知道,与构造函数中使用
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.talk3
这样的“静态”方法在调用时将使
Person
函数本身作为上下文对象(“
this
”)。除非您在静态方法中实际引用
,否则
Person.talk3
将与常规函数完全相同,例如
函数personTalk(){…}

它们只在分配一次的意义上类似于原型。除此之外,它们不以任何方式在实例上共享或可用

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

var p = new Person;
p.talk3(); // TypeError
talk3
Person
的实例上不存在。它只作为构造函数的属性存在一次


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

不管您创建了多少个
Person
实例,只有一个
Person.talk3
函数



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

创建多少个
Person
实例并不重要,只有一个
Person.talk3
功能



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

“…但每个都绑定到新创建的实例的上下文”嗯,不是真的,不。对象绑定到原型,而不是相反。“绑定”是在Javascript调用时建立的,而不是在创建实例时建立的。在那之前,方法只是一个对象(原型)的属性,所有实例都共享。是的,我可能用错误的方式表达了我的想法。我的意思是你说的“…但每个都绑定到新创建的实例的上下文中”嗯,不是真的,不是。对象绑定到原型,而不是反过来。“绑定”在Javascript中的调用时建立,而不是在创建实例时。在那之前,方法只是一个对象(原型)的属性,所有实例都共享它。是的,我可能用错误的方式表达了我的想法,我的意思是你想要的said@Syd当前位置我不确定所有现代人都不会,只要这样做是合理的/有用的。如今,甚至连微软的JavaScript引擎都非常出色。:-)Yeap thing have Evolutions:)@T.J.Crowder如果函数有一个副本,那么在多个实例中调用此单个函数时是否在堆栈中分配了局部变量?@CharlieH-是。“本地人总是在堆栈上。@西德妮:我不确定所有现代人都不会,如果这样做合理/有用的话。”。如今,甚至连微软的JavaScript引擎都非常出色。:-)Yeap thing have Evolutions:)@T.J.Crowder如果函数有一个副本,那么在多个实例中调用此单个函数时是否在堆栈中分配了局部变量?@CharlieH-是。本地人总是在堆栈上。