В первом вы можете создать объект только один раз, а во втором вы можете создать столько объектов, сколько захотите. И.Е. первый из них фактически одиночный.
Обратите внимание, что закрытия для второго не подходят. Каждый раз, когда вы его создаете, вы снова создаете функции и тратите кучу памяти. Объект-прототип предназначен для противодействия этому, где вы можете создать функции один раз за пределами области действия функции и не создавать случайных замыканий.
function foo2(){
this._bar = 0;
}
foo2.prototype = {
constructor: foo2,
getBar: function(){
return this._bar;
},
addOne: function(){
this._bar++;
},
addRandom:function(rand){
this._bar += rand;
}
};
Тогда:
var a = new foo2, b = new foo2, c = new foo2;
Создает три экземпляра, которые имеют свои _bar
, но имеют одинаковую функциональность.
JSPerf
Вы можете «сравнить» все это с PHP, часть кода даже не будет работать, но в принципе «эквивалентна»:
var foo = (function(){
var bar = 0;
return {
getBar: function(){
return bar;
},
addOne: function(){
bar++;
},
addRandom: function(rand){
bar += rand;
}
}
})();
примерно "эквивалентен" этому в PHP:
$foo = new stdClass;
$foo->bar = 0;
$foo->getBar = function(){
return $this->bar;
};
$foo->addOne = function(){
$this->bar++;
}
$foo->addRandom = function($rand){
$this->bar += $rand;
}
var foo2 = function(){
var bar = 0;
this.getBar = function(){
return bar;
};
this.addOne = function(){
bar++;
};
this.addRandom = function(rand){
bar += rand;
}
};
Примерно "эквивалентно" этому в PHP:
Class foo2 {
public function __construct(){
$bar = 0;
$this->getBar = function(){
return $bar;
};
$this->addOne = function(){
$bar++;
};
$this->addRandom = function($rand){
$bar += rand;
};
}
}
function foo2(){
this._bar = 0;
}
foo2.prototype = {
constructor: foo2,
getBar: function(){
return this._bar;
},
addOne: function(){
this._bar++;
},
addRandom:function(rand){
this._bar += rand;
}
};
Примерно "эквивалентно" этому в PHP:
Class foo2 {
public $_bar;
public function __construct(){
$this->_bar = 0;
}
public function getBar(){
return $this->_bar;
}
public function addOne(){
$this->_bar++
}
public function addRandom($rand){
$this->_bar += $rand;
}
}
... и является единственным, близким к ООП в трех приведенных выше примерах