MyObj.prototype。 vs这个

时间:2012-06-07 15:10:35

标签: javascript oop

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

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

1:使用this定义类定义中的方法。

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

2:使用prototype单独定义方法。

function MyObj(){    
}    

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

我现在正在搞乱这两件事,两者似乎都是一样的,所以我想我会找到差异,然后我会走上一条赛道,然后再回来咬我的屁股:)

干杯全部

2 个答案:

答案 0 :(得分:3)

使用this时,“class”的每个实例都有自己的方法副本。

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

例如,创建两个MyObj实例:

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

如果在构造函数中声明了doStuff方法,那么每个实例现在都在内存中有该方法的副本。如果它在prototype上声明,则他们共享该副本。当你试着打电话时:

o1.doStuff();

实例本身没有doStuff属性,因此我们将原型链向上移动到MyObj.prototype,其中有doStuff方法。

答案 1 :(得分:1)

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

在构造函数中this上定义属性是much slower,但是在以后实际访问这些属性方面locally defined properties have a slight performance advantage,因为JS引擎不必走原型链

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