привет.
если говорить коротко, да и про JS, то ты на верном пути.
ключевое слово `this` указывает на контекст исполнения функции, соответственно контекст можно менять.
к явным методам изменения контектса относят методы: `bind`, `call`, `apply`, к неявным - оператор "точка" (`obj.getName()`), ключевое слово `new` и другие случаи.
те 2 сниппета, что ты указал с примерами `Сart` не равнозначны, хоть занимаются, примерно, одним и тем же.
разберем пример неявного случая с оператором "точка":
/**
* какая-то функция, которая возвращает поле объекта name
* @returns {String}
*/
function getName () {
return this.name ? this.name : null;
}
var obj1 = {
name: 'name1',
getName: getName
}
var obj2 = {
name: 'name2',
getName: getName
}
// в данном случае, getName смотрит на obj1#name
console.log(obj1.getName()) // name1
// в данном случае, getName смотрит на obj2#name
console.log(obj2.getName()) // name2
советую, ознакомиться с методами задания контекста исполнения функции в книге `Reliable JavaScript: How to Code Safely in the World's Most Dangerous Language`, там достаточно наглядно описано.
если лень читать книгу, то посмотри эти 2 раздела:
learn.javascript.ru/functions-closures и
learn.javascript.ru/objects-more