Сразу предупреждаю: энтерпрайзное быдло ничего не поймет в этой теме
...
имплементация тривиальна. Надо просто забыть о нативных объектах, и исполльзовать вместо них ф-ции
ga=1; gb=2; gc=3; gd=4
proto_o1=function(arg){
return({c: gc, d: gd})[arg]
}
proto_o2=function(arg){
return ({g: 10})[arg]
}
o=function(arg){
return ({a: ga, b: gb})[arg]||proto_o1(arg)||proto_o2(arg)
}
console.log(o("a"), o("d"))
ga=10; gb=20; gc=30; gd=40
console.log(o("a"), o("d"), o("g"))
//out:
// 1 4
// 10 40 10
тут «объект» o наследует от proto_o1 и proto_o2 в чистейшем прототинпо-ориентированном стиле, иными словами, Ъ.
В даном примере еще один бонус: динамическое связывание, что видно из последней строчки. Для лексического можно использовать замыкания, естественно.