На самом деле эти функции не выполняют одно и то же действие.
Давайте рассмотрим первый.
let i = {a: 'apple', b: function(){return i.a}}
Вы определяете функцию function(){return i.a}
, которая будет возвращать значение из объекта i.,Когда бы и где бы он ни вызывался, он будет возвращать значение из объекта i.Это полностью не зависит от области применения.Вы не можете повторно использовать эту функцию как метод прототипа.Потому что i
всегда i
.Это может быть полезно, если вы не используете функции стрелок для защиты контекста вызова.
С другой стороны, другая функция отличается.
let j = {a: 'apple', b: function(){return this.a}}
Вы используете this
, поэтомуон получит доступ к свойству в зависимости от его контекста.
Делая все более понятным на примере.Допустим, у меня есть объекты овец и собак со свойством sound
.
const dog = {
sound: 'woof-woof'
};
const sheep = {
sound: 'Meaeeeeee'
};
Теперь я определяю функцию makeSound
function makeSound {
alert(this.sound)
}
Теперь я хочу использовать makeSound
для обоих животных.Все, что мне нужно сделать, это вызвать эту функцию, предоставив ей контекст.
makeSound.call(sheep) // -> Meaeeeeee
makeSound.call(dog) // -> woof-woof
this
помог мне повторно использовать эту функцию для различных типов объектов.Отсюда и произошло наследование прототипа.