Hello我知道原型定义一次并且对于所有对象实例都是通用的,但是每个都绑定到创建的新实例的上下文。我也知道它与定义的方法相比节省了内存在构造函数中使用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
};
他们是否喜欢原型?
答案 0 :(得分:2)
您创建的Person
个实例数无关紧要,只有一个Person.talk3
函数。
附注:您对talk
和talk2
的评论在创建函数对象的数量方面都是正确的。现代JavaScript引擎可能会在为其创建的500个函数对象中的每一个中重用{{1>}中的代码(如果有大量代码,这可能是相关的),但这是一个实现/优化细节。
答案 1 :(得分:1)
它们只是像原型那样被分配一次。除此之外,它们不共享或以任何方式在实例上可用。
另外,"静态"您的示例中的Person.talk3
方法在调用时会将Person
函数本身作为上下文对象(" this
")。除非您在静态方法中实际引用this
,否则Person.talk3
将与常规函数完全相同,例如function personTalk () {...}
。
答案 2 :(得分:0)
var p = new Person;
p.talk3(); // TypeError
talk3
的实例上不存在 Person
。它仅作为构造函数的属性存在,一次。