javascript – ¿Herencia vs mixins en lenguajes dinámicos?

Pregunta:

¿Cuándo debería preferir los patrones de herencia a los mixins en lenguajes dinámicos?

Por mixins, me refiero a la mezcla adecuada real, como en la inserción de funciones y miembros de datos en un objeto en tiempo de ejecución.

¿Cuándo usaría, por ejemplo, herencia de prototipos en lugar de mixins? Para ilustrar más claramente lo que quiero decir con mixin, un pseudocódigo:

asCircle(obj) {
  obj.radius = 0
  obj.area = function() {
    return this.radius * this.radius * 3.14
  }

myObject = {}
asCircle(myObject)
myObject.area() // -> 0

Respuesta:

La herencia prototípica es simple. Tiene una única ventaja sobre los mixins.

Es que es un enlace en vivo. si cambia el prototipo todo lo que hereda se cambia.

Ejemplo usando pd

var Circle = {
  constructor: function _constructor() {
    this.radius = 0;
    return this;
  },
  area: function _area() {
    return this.radius * this.radius * Circle.PI
  },
  PI: 3.14
};

var mixedIn = pd.extend({}, Circle).constructor();
var inherited = pd.make(Circle, {}).constructor();

Circle.perimeter = perimeter;

inherited.perimeter(); // wins
mixedIn.perimeter(); // fails

function perimeter() {
  return 2 * this.radius;
}

Básicamente, si desea que los cambios en el círculo de "interfaz" se reflejen en tiempo de ejecución en todos los objetos que "usan" su funcionalidad, herede de ella.

Si no desea que los cambios se reflejen, mézclelos.

Tenga en cuenta que los mixins también tienen más propósito. Los mixins son su mecanismo de "herencia" múltiple.

Si desea que un objeto implemente múltiples "interfaces", tendrá que mezclar algunas. La que usa para la herencia prototípica es la que desea que reflejen los cambios en el tiempo de ejecución, los demás se mezclarán.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım