【发布时间】:2016-07-14 02:57:21
【问题描述】:
javascript介绍说: 当我有如下代码时:
var Person=function(name){
this.name=name;
this.sayHello=function(){return 'Hello '+name;}
}
每当我实例化一个“Person”时,内存中都会有一个“sayHello”函数的副本。为了减少这种内存消耗,我可以更改如下代码:
var Person=(function(){
var sayHello=function(){return 'Hello '+name}
return function(name){
this.name=name
this.sayHello=sayHello
}
})()
这样,sayHello()就不会有多个副本了
我的问题是:
- 对于第一种类型的代码,除了浪费更多内存还有什么好处?
- 我们应该以第二种方式编写代码,还是 javascript 应该避免每个实例一个函数一个副本?
非常感谢。
【问题讨论】:
-
或选项 3,
Person.prototype.sayHello = function() { ... }。您的函数的第一个版本有点奇怪,因为它只返回name的原始 值,而不是this.name的当前值。您的函数的第二个版本实际上不起作用,因为它尝试访问的变量name与返回的函数中的name参数不同。 -
@nnnnnn:实际上这就是为什么第二个版本根本不起作用的原因,它会产生
window.name的值(如果你在没有@ 的情况下调用Person,它仍然可能有一个值987654330@). -
@Bergi - 是的,我只是在编辑我的评论以提及这一点。尽管您在没有
new的情况下调用Person()的额外点非常重要,我没想到要提及这一点。 -
您应该只从构造函数内部将实例方法分配给
this,当该方法需要访问作用域为构造函数的变量/函数时。 所有其他实例方法都应该分配给原型。 -
“内存中函数的副本”可能不是很昂贵。是的,它比不这样做的解决方案更昂贵,但不是很多。该函数的代码是不可变的,因此它可以被所有实例共享。如果您要制作 1,000,000 个 Person 实例,那么这很重要,但如果您要制作 10 或 100 个实例,则可能无关紧要。
标签: javascript function object instance