Все просто: this - это объект из которого вызывается ф-ия, все.
пример:
obj.func() // тут this = obj
obj.user.func() // тут this = user
func() // тут this = window, т.к. объект не укаазан
если переместить функцию в другой объект, то правило сохраняется, т.е. this будет ссылаться на новы объект из которого вызывается функция.
Так же есть функции которые позволяют задать this:
func.call(newThis, args1, arg2, arg3)
func.apply(newThis, [args1, arg2, arg3])
call и
apply вызывают функцию и задают this, т.е. this = newThis
По сути это всё, все другие фокусы основаны на этом, например ф-ия
bind (IE 9+) которая просто замыкает (привязывает) нужный this:
funcWithThis = func.bind(newThis)
В итоге как бы её не вызвать: funcWithThis() или obj.funcWithThis(), исходная функция func будет вызвана с указанным this=newThis.
На счет классов и new:
inst = new MyClass(arg)
можно разложить примерно так:
inst = {};
inst.__proto__ = MyClass.prototype;
inst.constructor = MyClass;
inst = MyClass.call(inst, arg) || inst;
т.е. new создает новый объект с прототипом от MyClass, а потом вызывает эту ф-ию с установкой this как новый объект.