3

JS newb 在这里所以希望这不是一个愚蠢的问题。

在使用方法定义自定义对象时,以下两种方法有什么区别和优缺点?

1:使用在类定义中定义方法this

function MyObj(){    
    this.doStuff = function(){    
        //method body    
    }    
}

2:使用单独定义方法prototype

function MyObj(){    
}    

MyObj.prototype.doStuff = function()    
{    
    //method body    
}

我现在正在搞乱它,而且两者似乎都工作相同,所以我想我会在我走上一条稍后会回来咬我屁股的赛道之前找到不同之处:)

祝大家欢呼

4

2 回答 2

3

当您使用this时,您的“类”的每个实例都将拥有自己的方法副本。

当您使用 时prototype,所有实例都将共享该方法的一个副本。因此,在 上声明方法更有效prototype,因为每个实例需要更少的内存。

例如,创建两个实例MyObj

var o1 = new MyObj(),
    o2 = new MyObj();

如果doStuff在构造函数中声明了该方法,那么这些实例中的每一个现在在内存中都有该方法的副本。如果它是在 上声明的prototype,他们共享那一份。当您尝试调用它时:

o1.doStuff();

实例本身没有doStuff属性,所以我们将原型链向上移动到MyObj.prototypedoStuff方法的地方。

于 2012-06-07T15:13:10.360 回答
1

除了内存方面的考虑之外,还有性能方面的考虑。

this在构造函数中定义属性要慢得多,但就稍后实际访问这些属性而言,本地定义的属性具有轻微的性能优势,因为 JS 引擎不必沿着原型链向上走。

换句话说,如果您不经常创建少量对象,最好在构造函数中本地定义属性(#1),但如果您要创建很多对象,请使用prototype(#2)。

于 2012-06-07T15:37:05.933 回答