У меня уже были попытки имплементации, но все они были не особо красивыми. Вот, наконец, получился вполне годный вариант. Это реализация на основе Proxy — фича, добавленная в es6. Этот вариант будет работать, пока, только в новых V8. Я проветял на ноде 0.11.14 с флагом --harmony
init={
protos: [],
appendProto: function(o){this.protos.push(o)},
removeProto: function(o){this.protos=this.protos.filter(function(x){return x!==o})},
get: function(proxy, msg){
var result
if(this[msg]) return this[msg]
if(this.protos.some(function(o){return result=o[msg]})) return result
}
}
createObject=function(){
return Proxy.create(
(function(){var o=Object.create(init); o.protos=[]; return o})()
)
}
o1=createObject()
o2=createObject()
o1.appendProto({a: 1})
o1.appendProto({b: "foo"})
o1.appendProto({c: 100})
o2.appendProto({a: 10})
o2.appendProto({b: "bar"})
console.log(o1.a, o1.b, o1.c, o2.a, o2.b, o2.c) // 1 'foo' 100 10 'bar' undefined
o3=createObject()
o3.appendProto({another: 300})
o1.appendProto(o3) // добавляем в качестве прототипа "наш" объект
console.log(o1.another) // 300 bingo!!!
Версия сырая, конечно, надо допиливать. В частности,я не разобрался пока, как запилить сеттер для такого объекта. Но главное, видно, что в целом данный подход работает.