Implementação:
var _with = function(proto, overrides) {
if (!overrides) overrides = {};
// that's the trick
var ctor = function() { this.__proto__ = proto; };
ctor.prototype = proto;
var child = new ctor();
// 'child'.[[Prototype]] pseudoproperty is set to 'proto' now
// and real 'child.__proto__' property added
for (var prop in overrides)
if (overrides.hasOwnProperty(prop))
child[prop] = overrides[prop];
return child;
};
Exemplo de uso:
var Clazz = {
x: 10,
y: 20,
method: function() {
return this.x;
},
method2: function() {
return this.__proto__.x; // referencing parent
}
};
var DerivedClazz = _with(Clazz, {x: 15});
var instance = _with(DerivedClazz);
alert(instance.y); // 20
instance.x = 100;
alert(instance.x); // 100
alert(instance.method()); // 100
alert(instance.method2()); // 15
alert(DerivedClazz.x); // 15
alert(Clazz.x); // 10
Conforme descrito aqui: http://tonsky.livejournal.com/244260.html