It's literally how it works for arrow-less functions, though - "this" is bound to the receiver at call site:
foo = function() { console.log(this.n); };
o1 = { foo, n: 1 };
o2 = { foo, n: 2 };
o1.foo(); // 1
o2.foo(); // 2
I can't think of any other language that does it this way. Arrow-functions, OTOH, behave as lambdas normally do: foo = () => { console.log(this.n); };
o1 = { foo, n: 1 };
o2 = { foo, n: 2 };
o1.foo(); // undefined
o2.foo(); // undefined