Soluciones a problemas que pueden ser reutilizadas fácilmente, como plantillas o recetas para problemas.
No son soluciones exactas.
Nos ayudan a crear un plan para construir nuestra solución.
Patterns:
Prácticas standard
Anti-Patterns:
Lecciones aprendidas
Un mal diseño que merece la pena documentar
var newObject = {};
var newObject = Object.create(Object.prototype);
var newObject = new Object();
function Coche (modelo, año, km) {
this.modelo = modelo;
this.año = año;
this.km = km;
this.toString = function () {
return this.modelo + " tiene " + this.km + " km";
};
}
// Uso:
// Podemos crear nuevas instancias de 'Coche'
var civic = new Coche("Honda Civic", 2009, 20000);
var mondeo = new Coche("Ford Mondeo", 2010, 5000);
civic.toString(); // -> "Honda Civic tiene 20000 km"
mondeo.toString(); // -> "Ford Mondeo tiene 5000 km"
function Coche (modelo, año, km) {
this.modelo = modelo;
this.año = año;
this.km = km;
}
Coche.prototype.toString = function() {
return this.modelo + ' tiene ' + this.km + ' km';
}
var miCoche = new Coche("Ford Escort", 1993, 150000);
console.log(miCoche) // --> "Ford Escort tiene 150000 km"
var miCoche = {
nombre: "Ford Escort",
conducir: function() {
console.log("conduciendo!");
},
frenar: function() {
console.log("stop!");
},
}
// usa Object.create para instanciar un nuevo coche
var tuCoche = Object.create(miCoche);
var vehiculo = {
getModelo: function() {
console.log("Modelo del vehículo", this.modelo);
}
};
var coche = Object.create(vehiculo, {
id: {
value: MY_GLOBAL.nextId(),
// writable: false, configurable: false <-- false by default
enumerable: true
},
modelo: {
value: "Ford Escort",
enumerable: true
}
});
var vehiculoPrototipo = {
init: function(modelo) {
this.modelo = modelo;
},
getModelo: function() {
console.log("Modelo del vehículo: " + this.model);
}
};
function vehiculo(modelo) {
function F() {}
F.prototype = vehiculoPrototipo;
var f = new F();
f.init(modelo);
return f;
}
// lo usamos asi:
var coche = vehiculo("Ford Escort");
coche.getModelo();
function Coche (modelo, año, km) {
this.modelo = modelo;
this.año = año;
this.km = km;
}
Coche.prototype.toString = function() {
return this.modelo + ' tiene ' + this.km + ' km';
}
var miCoche = new Coche("Ford Escort", 1993, 150000);
console.log(miCoche) // --> "Ford Escort tiene 150000 km"
var myNamespace = (function() {
// esta variable es privada
var myPrivateVar = 0;
// este método también
var myPrivateMethod = function(foo) {
console.log(foo);
};
return {
// Una variable pública:
myPublicVar: 'foo',
// un método publico que usa cosas privadas
myPublicFunction: function(bar) {
// Incrementa el contador privado
myPrivateVar++;
// llama a nuestro método privado usando bar
myPrivateMethod(bar);
}
};
})(); //<-- Invocamos la función directamente
var mySingleton = (function () {
var instance;
function init() {
function privateMethod() {
console.log("soy Privado");
}
var privateVariable = "yo también soy privada";
var privateRandom = Math.random();
return {
publicMethod: function () {
console.log( "el público me puede ver!");
},
publicProperty: "y a mi también",
getRandomNumber: function() {
return privateRandomNumber;
}
};
};
return {
getInstance: function() {
if (!instance) {
instance = init();
}
return instance;
}
};
})();
function ObserverList() {
this.observerList = [];
}
ObserverList.prototype.add = function(obj) {
return this.observerList.push(obj);
}
ObserverList.prototype.count = function() {
return this.observerList.length;
}
ObserverList.prototype.get = function(index) {
if (index > -1 && index < this.observerList.length) {
return this.observerList[index]:
}
}
ObserverList.prototype.indexOf = function(obj, startIndex) {
var i = startIndex;
while (i < this.observerList.length) {
if (this.observerList[i] === obj) {
return i;
}
i++;
}
return -1;
};
ObserverList.prototype.removeAt = function(index) {
this.observerList.splice(index, 1);
};
function Subject() {
this.observers = new ObserverList();
}
Subject.prototype.addObserver = function(observer) {
this.observers.add(observer);
};
Subject.prototype.removeObserver = function(observer) {
this.observers.removeAt(this.observers.indexOf(observer, 0));
};
Subject.prototype.notify = function(context) {
var observerCount = this.observers.count();
for (var i = 0; i < observercount; i++) {
this.observers.get(i).update(context);
}
};
function Observer() {
this.update = function() {
// ...
}
}
var noLeidos = 0;
// podemos tener un subscriptor atento a cuando lleguen nuevos mensajes
// y que se encargue de renderizarlos en la pantalla:
var subs1 = subscribe("inbox/mensajeNuevo", function(sujeto, datos) {
// ** haz algo con el mensaje
renderizaMensaje(datos);
});
// y otro subscriptor que se encargue de actualizar el contador de
// mensajes no leidos
var subs2 = subscribe("inbox/mensajeNuevo", function(sujeto, datos) {
// actualiza el contador
actualizarContador(++unreadCount);
});
// y luego en otra parte de nuestro código:
publish("inbox/mensajeNuevo", [
{
sender: 'hello@google.com',
body: 'hola! que tal?'
}
]);
(from Game Programming Patterns)
handleInput() {
if (isPressed(BUTTON_X)) jump();
else if (isPressed(BUTTON_Y)) fireGun();
else if (isPressed(BUTTON_A)) swapWeapon();
else if (isPressed(BUTTON_B)) crouch();
}
var Command = function() {
this.execute = function() {};
}
function JumpCommand() {
this.execute = function() {
jump();
}
}
function FireCommand() {
this.execute = function() {
fireGun();
}
}
function InputHandler () {
var botones = {
X : new Command(),
Y : new Command(),
A : new Command(),
B : new Command()
};
return {
handleInput() {
if (isPressed(BUTTON_X)) botones.X.execute();
else if (isPressed(BUTTON_Y)) botones.Y.execute();
else if (isPressed(BUTTON_A)) botones.A.execute();
else if (isPressed(BUTTON_B)) botones.B.execute();
},
setButton(boton, comando) {
// nos aseguramos de que `comando` implementa la interfaz
// de Command
if (!comando.hasOwnProperty('execute')) return null
botones[boton] = comando;
}
}
}
function Command () {
this.execute = function() {};
this.undo = function() {};
}
function CommandHistory() {
this.undoHistory = [];
this.redoHistory = [];
this.performCommand = function(command) {
undoHistory.push(command);
command.execute();
}
this.undo = function() {
var lastCommand = undoHistory.pop();
if (!lastCommand) return null;
lastCommand.undo();
redoHistory.push(lastCommand);
}
this.redo = function() {
var lastCommand = redoHistory.pop();
if (!lastCommand) return null;
lastCommand.execute();
undoHistory.push(lastCommand);
}
}