原型:
function Viechel() {
this.speed = 100;
}
Viechel.prototype.speedUp = function() {
this.speed += 10;
}
var car = new Viechel();
闭包:
function viechel() {
var speed = 100;
return {
getSpeed: () => speed,
speedUp: function() {
speed += 10;
}
}
}
var car = viechel();
前段时间在看关于这两块的知识,发现这两种技术的作用很相似。
(也可能是我写的例子不好……)
但是我不清楚什么场景该用前者什么时候该用后者……
闭包比原型常用,常用的原因上面他们都提到了,然而闭包本来不是用来构建对象的,构建对象本来是原型的工作,但是闭包却也可以用来构建对象,你的例子就是它们构建对象的情况。
js每次实例化对象时,都会把构造函数执行一遍,你的例子中,构造函数是
Viechel
,很明显原型中的构造函数比闭包中的构造函数代码量要少很多,因为闭包把对象的方法都写在构造函数中,所以实际上,单单比较实例化的速度的话,原型是甩闭包N条街的,尤其是你的对象有大量方法的时候特别突出。这是两者实例化速度对比的测试:http://jsperf.com/clos-vs-proto
但是讲到调用对象的方法,则是闭包的要快,因为原型的对象的方法是存在对象的原型链中,寻址速度略慢。这是两者调用对象方法的速度对比的测试:http://jsperf.com/prototype-vs-closure-single-object
如果你要构建的对象实例化的数量少(我觉得一个页面不要多于3次吧),但是需要经常调用对象的方法,就用闭包吧。比如自己写的函数库,h5音乐播放控制,banner切换控制。还挺多的,实际上因为这样,很多人很推崇闭包。
如果要大量实例化的,不管方法调用得多不多,都要用原型。比如jquery的Dom操作部分,一个图表的每个数据点,。