Разница между двумя способами, которыми методы объекта могут ссылаться на свойства объекта - PullRequest
0 голосов
/ 19 декабря 2018

Существует два способа ссылки на свойства объекта для методов объекта:

let i = {a: 'apple', b: function(){return i.a}}
let j = {a: 'apple', b: function(){return this.a}}

console.log(i.b())  // apple
console.log(j.b())  // apple

Каковы плюсы / минусы этих двух подходов к ссылкам на свойства объекта ??

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

На самом деле эти функции не выполняют одно и то же действие.

Давайте рассмотрим первый.

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 помог мне повторно использовать эту функцию для различных типов объектов.Отсюда и произошло наследование прототипа.

0 голосов
/ 19 декабря 2018

Они имеют в виду разные вещи.Первый возвращает свойство a некоторой переменной i, которая находится в области видимости.Тот факт, что объект также называется i, означает, что он работает как положено.Но это не гарантировано.Например:

let i = {a: 'apple', b: function(){return i.a}}
let j = i
i = {a: "potato"}

console.log(j.b()) // apple or potato?

До тех пор, пока вы ожидаете, что функция заглянет в область видимости, найдите i и вернете ее a проп, тогда это работает, как и ожидалось.Но это не значит, вернуть a опору объекта в этой функции.

Тогда секунда означает , что означает, что, если она вызывается с i.b(), но this не относится к объекту, где была определена функция - его значение определяется контекстом вызова функции.Например

let i = {a: 'apple', b: function(){return this.a}}
let j = {a: 'potato'}
j.b = i.b

console.log(j.b()) // apple or potato

Один не лучше , чем другой, это разные идеи и могут выполнять разные функции.

...