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-是。本地人总是在堆栈上。