◆ オブジェクトクローンができないと微妙

with ってスコープチェーンに割りこむので
var a = 1
var o = {a:2}
with(o){
console.log(a)
a = 3
}
console.log(a, o)
2
1  Object {a: 3}

になりますよね


プロトタイプチェーンでも間に割り込ませたいことがあります
ということでこんなものを作ってみました
Object.prototype.putProto = function(obj){
    var inter_proto = Object.assign({}, obj)
    inter_proto.__proto__ = this.__proto__
    this.__proto__ = inter_proto
    return this
}

Object.prototype.bindProto = function(obj){
    var inter_proto = Object.assign({}, obj)
var bthis = Object.assign(new this.constructor(this), this)
    inter_proto.__proto__ = this.__proto__
    bthis.__proto__ = inter_proto
    return bthis
}

違いは this を変更する(破壊的)かどうかです
bind は 関数の bind メソッドと同じく新しいオブジェクトを返す仕様です
var array_extend = {
map: function(fn){
if(typeof fn !== "function"){
fn = (name => e => e[name])(fn)
}
return this.__proto__.__proto__.map.bind(this)(fn)
}
}

var a = [{a:1}, {a:2,b:3}]
a.bindProto(array_extend).map("a")
// [1, 2]

ちゃんと動く例を使いましたが Object.assign のコピーなので完全とはいかないです
bind されたオブジェクトでは getter/setter が使えなくて enumerable が false のプロパティはコピーされていません

割りこませるオブジェクトだけを コピーする putProto のほうが実用性あるかもしれないです
ただし 破壊的なのでずっと割り込みが入ったままになります