From harness-claude
> Add reusable behaviors to classes without deep inheritance chains
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeThis skill uses the workspace's default tool permissions.
> Add reusable behaviors to classes without deep inheritance chains
Guides choosing inheritance vs composition in OOP for class hierarchies and object composition. Includes Java examples like Vehicle/Car.
Shares properties and methods across JavaScript instances via prototype chain. Use for memory-efficient objects with many shared methods, avoiding per-instance duplication.
Applies ES6+ JavaScript patterns including async/await, destructuring, spread operators, promises, modules, iterators, generators, and functional programming to refactor legacy code and optimize applications.
Share bugs, ideas, or general feedback.
Add reusable behaviors to classes without deep inheritance chains
class MyClass extends Mixin2(Mixin1(Base)) {}.Object.assign(Target.prototype, mixinMethods) for simpler method injection.// Functional mixin approach
const Serializable = (Base) =>
class extends Base {
serialize() {
return JSON.stringify(this);
}
static deserialize(json) {
return Object.assign(new this(), JSON.parse(json));
}
};
const Timestamped = (Base) =>
class extends Base {
constructor(...args) {
super(...args);
this.createdAt = new Date();
}
};
class User extends Serializable(Timestamped(class {})) {
constructor(name) {
super();
this.name = name;
}
}
const u = new User('Alice');
console.log(u.serialize()); // {"name":"Alice","createdAt":"..."}
JavaScript's single-prototype-chain inheritance means a class can only extend one parent. Mixins work around this by composing behaviors through function application rather than inheritance.
Trade-offs:
instanceof checks do not work for mixins applied via Object.assign (only for the class mixin approach)When NOT to use:
https://patterns.dev/javascript/mixin-pattern