6. ¿Qué es un Objeto?
Un conjunto no ordenado de pares clave-valor.
Estos pares son llamados propiedades.
Cuando el valor de una propiedad es una función decimos
que es un método.
9. [[Prototype]]
Propiedad interna que apunta al prototipo del
objeto. Algunas implementaciones proveen la
propiedad __proto__ (no-standard) como
referencia explícita.
11. Prototype Chain
Es el mecanismo de herencia en JavaScript.
Cuando le pedimos una propiedad a un objeto, se busca primero entre las
propiedades del objeto y luego si no existe, se sigue la cadena de
[[Prototype]] hasta encontrarlo.
12. Clases
Los objetos se crean mediante constructores.
Un constructor es una función que va a ser llamada con new.
El constructor tiene asociado un objeto llamado prototype.
El prototype se utiliza para definir propiedades de instancia.
Por defecto, el prototype es una instancia de Object, por lo tanto,
su [[Prototype]] apunta al Object.prototype.
27. “Using inheritance as a vehicle to
reuse code is a bit like ordering a
happy meal because you want the
plastic toy”
Angus Croll.
28. *Abstract*Class / *Base*Class
Usualmente cuando utilizamos algún framework
que provee clases de las cuales tenemos que
extender (por ej. Views, Components,
Controllers, etc.) y nos encontramos código que
se repite entre las subclases.
29. Problemas
• Agregamos niveles de herencia.
• La clase Base/Abstracta se vuelve una
bolsa de funciones comunes.
• Las subclases acceden a mas funcionalidad
de la realmente requerida.
• Refactorizar se vuelve mas complejo.
32. … pero el código se vuelve verborrágico
var instance = {
msg: ‘Hello from instance’
};
//borrowing foo method from MyClass
MyClass.prototype.foo.apply(instance); // Hello from instance
//borrowing bar method from ClassA
ClassA.prototype.bar.apply(instance); // Hello from instance from bar
//borrowing foo method from ClassA inherited from MyClass
ClassA.prototype.foo.apply(instance); // Hello from instance
34. ¿Qué es un Mixin?
Un Mixin es una clase que, por lo general, no
está pensada para ser instanciada o extendida,
sino combinada en otra clase.
El Mixin es combinado en la clase a través de
un merge.
En JavaScript, podemos usar Objects como
Mixins.
35. Mixins: Beneficios
Incentivan la reutilización de código.
Pueden ser utilizados como una
solución alternativa a la herencia
múltiple.
Evitan la ambigüedad de herencia (The
diamond problem) linealmente.
42. The Diamond Problem
Object.assign(DerivedClass.prototype, ClassA.prototype, ClassB.prototype);
var d = new DerivedClass();
d.foo() // from ClassB
Object.assign(DerivedClass.prototype, ClassB.prototype, ClassA.prototype);
var d = new DerivedClass();
d.foo() // from ClassA
43. Llamar a un Método Sobre-escrito
….
Object.assign(DerivedClass.prototype, ClassA.prototype, ClassB.prototype);
DerivedClass.prototype.foo = function() {
// call “overridden” foo from A
ClassA.prototype.foo.apply(this, arguments);
}
44. Problemas
Métodos y propiedades son sobre-escritos
basados en la posición de la declaración.
Refactoring (agregar/renombrar métodos) puede
causar “problemas silenciosos”.
Llamar a un metodo sobre-escrito es
verborragico y propenso a errores.
46. ¿Qué es un Trait?
Unidades de comportamiento que se
pueden componer.
Un tipo especial de clases sin estado.
Se los puede ver como clases incompletas.
Definen comportamiento y acceden al
estado a través de métodos requeridos.
48. Componiendo Comportamiento
Puede requerir un conjunto de métodos que
servirán como parámetros del comportamiento
ofrecido. (Clase incompleta)
Pueden ser compuestos por otros traits.
La colisión de nombres debe ser resuelta por el
desarrollador (usando alias y exclusiones)
49. Resolución de Conflictos
Un Conflicto aparece cuando combinamos dos o
mas traits que provean métodos llamados
idénticamente que no se originen en el mismo
trait.
Alias:Un método conflictivo se puede
“renombrar".
Exclusión: Podemos resolver el conflicto
excluyendo el método en cuestión.
54. Resolución de Conflictos:
Alias o Exclude
Podemos usar exclude en “first” del Trait iterable
o alias para renombrarlo en caso que queramos
usarlo (Una alternativa de llamar al metodo
sobre-escrito)