Существуют ли какие-либо важные/тонкие/существенные различия под капотом при выборе одного из этих четырех шаблонов над другими? И существуют ли какие-либо различия между ними, когда "создается экземпляр" через Object.create()
против оператора new
?
1) Образец, который CoffeeScript
использует при переводе определений класса:
Animal = (function() {
function Animal(name) {
this.name = name;
}
Animal.prototype.move = function(meters) {
return alert(this.name + (" moved " + meters + "m."));
};
return Animal;
})();
и
2) Образец, который Knockout
, кажется, способствует:
var DifferentAnimal = function(name){
var self = this;
self.name = name;
self.move = function(meters){
return alert(this.name + (" moved " + meters + "m."));
};
}
и
3) аналогичный простой шаблон, который я часто видел:
var DifferentAnimalWithClosure = function(name){
var name = name;
var move = function(meters){
};
return {name:name, move:move};
}
и
4) Шаблон, который Backbone
способствует:
var OneMoreAnimal= ClassThatAlreadyExists.extend({
name:'',
move:function(){}
});
Обновление 1: Изменен шаблон # 2 и добавлен шаблон # 3 в ответ на ответ Elias//незначительное форматирование