Привет мир! Это Нао!
Я вхожу в группу, готовящуюся к погружению в Code Chrysalis в октябре 2019 года. Это единственный в Токио учебный курс по программированию в стиле Силиконовой долины! Ху!

У меня нет технического образования, но каким-то образом к счастью появилась эта замечательная возможность. Возбужденный, взволнованный, нервный, НО взволнованный!

Я постараюсь записать здесь то, что я узнаю. Это будут маленькие шаги, и я мог бы использовать запрограммированный английский. Пожалуйста, потерпите меня! ;) Любые советы будут оценены!

Хорошо, приступим.

Используйте это ключевое слово

this — это специальное ключевое слово в JavaScript. Вскоре он проверяет объект, в котором он существует, включая глобальный объект. (Это зависит от строгого/нестрогого режима. Для простоты я сейчас пропущу объяснение этого.)

Например…

У нас есть объект с именем harry.

const harry = {
 name: “Harry Potter”,
 house: “Gryffindor”,
 pet: “Hedwig”,
 patronus: “Stag”,
 greeting:function(){
 console.log(“Hello! My name is “ + this.name + “!” );
 }
}

Давайте заставим Гарри сказать привет!

harry.greeting(); // “Hello! My name is Harry Potter!”

Ура! Это довольно простой пример.
Теперь this проверяет объект harry. Так что он может получить доступ к harry.name ;)

Затем, что, если у нас есть больше объектов. Я хочу пригласить Рона и Гермиону!

const ron = {
 name: “Ronald Weasley”,
 house: “Gryffindor”,
 pet: “Scabbers”,
 patronus: “Jack Russell terrier”, 
 greeting:function(){ 
 console.log(“Hello! My name is “ + this.name + “!” );
 }
}
const hermione = {
 name: “Hermione Granger”,
 house: “Gryffindor”,
 pet: “Crookshanks”,
 patronus: “Otter”,
 greeting:function(){
 console.log(“Hello! My name is “ + this.name + “!” );
 }
}

Теперь у меня есть их объект здесь. Заставим их поздороваться!

ron.greeting(); // “Hello! My name is Ronald Weasley!”
hermione.greeting(); // “Hello! My name is Hermione Granger!”

Ура!

Но ждать. Я что-то упустил?

Да.

Старайтесь не повторять

Вы когда-нибудь слышали о «Не повторяйся» раньше?
Согласно Википедии, это принцип разработки программного обеспечения.

Как стажер инженера-программиста, я должен следовать этому;)

Теперь я повторяюсь, используя функцию приветствия во всех объектах, Гарри, Роне и объекте Гермионы. Три раза.

Давайте сделаем мой код лучше. Извлеките функцию и выполните ее!

const harry = {
 name: “Harry Potter”,
 house: “Gryffindor”,
 pet: “Hedwig”,
 patronus: “Stag”
}
const ron = {
 name: “Ronald Weasley”,
 house: “Gryffindor”,
 pet: “Scabbers”,
 patronus: “Jack Russell terrier”
}
const hermione = {
 name: “Hermione Granger”,
 house: “Gryffindor”,
 pet: “Crookshanks”,
 patronus: “Otter”
}
const greeting = function(){
 console.log(“Hello! My name is “ + this.name + “!” );
}

Что я получу?

harry.greeting(); // ??
ron.greeting(); // ??
hermione.greeting(); // ??

Ой! У меня есть ошибки!

Uncaught TypeError: harry.greeting is not a function
Uncaught TypeError: ron.greeting is not a function
Uncaught TypeError: hermione.greeting is not a function

это чувствительно к тому, где оно существует

Приветствие — это функция. Но это не работает.
Давайте еще раз посмотрим на приветствие.

const greeting = function(){
 console.log(“Hello! My name is “ + this.name + “!” );
}

Возможно, вы уже знали. Но позвольте мне уточнить это.

Причина, по которой я получаю эти ошибки, заключается в ключевом слове this.
Как я уже писал ранее, оно проверяет объект там, где он существует.

Теперь, где он существует?

В глобальном объекте, правильно. Поэтому он не может получить доступ к каждому свойству объекта.

Например,

<<OLD CODE>>
const hermione = {
 name: “Hermione Granger”,
 house: “Gryffindor”,
 pet: “Crookshanks”,
 patronus: “Otter”,
 greeting:function(){
  console.log(“Hello! My name is “ + this.name + “!” );
 }
}

В этом случае объект hermione имеет приветствие в качестве своего метода. Таким образом, ключевое слово this может видеть свое свойство. Не проблема его выполнить.

<<PRESENT CODE>>
const hermione = {
 name: “Hermione Granger”,
 house: “Gryffindor”,
 pet: “Crookshanks”,
 patronus: “Otter”
}
const greeting = function(){
 console.log(“Hello! My name is “ + this.name + “!” );
}
hermione.greeting is not a function anymore!!

После удаления метода у каждого объекта больше нет никакого метода. Итак, я получил ошибки.

Хорошо, теперь мы знаем причину. Но я все равно хочу, чтобы они поздоровались!

Время попробовать bind()!

Согласно MDN, bind() — это…

Метод bind() создает новую функцию, для которой при вызове ключевое слово this устанавливается равным предоставленному значению с заданной последовательностью аргументы, предшествующие любым предоставленным при вызове новой функции.

из MDN

Звучит немного сложно…

Попробуем связать объект all с функцией приветствия.

const boundedHarry = greeting.bind(harry);
const boundedRon = greeting.bind(ron);
const boundedHermione = greeting.bind(hermione);
boundedHarry(); // “Hello! My name is Harry Potter!”
boundedRon(); // “Hello! My name is Ronald Weasley!”
boundedHermione(); // “Hello! My name is Hermione Granger!”

Ура!
В данном случае не повторяюсь, а успеваю поприветствовать! Ву!

Итак, здесь bind() привязывает функцию приветствия к трем объектам при ее вызове. А в приветствии есть ключевое слово this. Итак, при каждом выполнении this идет и видит каждый объект. Поскольку он привязан к Гарри, он может пойти и увидеть объект Гарри;)

Другой пример

Прежде чем я закончу, я предполагаю, что есть еще один пример метода bind(). Позвольте мне попробовать это.

Когда я использовал bind() в предыдущем примере, я смог связать контекст аргумента с функцией приветствия. Я связал их, чтобы использовать функцию в контексте каждого объекта.

Функция приветствия смогла получить harry.name.
Функция приветствия смогла получить ron.name.
Функция приветствия смогла получить hermione.name.

Тогда что, если приветствие НЕ является глобальной функцией. Я ожидаю, что смогу привязать функцию к другим объектам.

Давайте проверим это!

<<This is the very first code that I wrote at the top of this article>>
const harry = {
 name: “Harry Potter”,
 house: “Gryffindor”,
 pet: “Hedwig”,
 patronus: “Stag”,
 greeting:function(){
  console.log(“Hello! My name is “ + this.name + “!” );
 }
}

И что мне нужно, так это связать их… Итак,

const ron = {
 name: “Ronald Weasley”,
 house: “Gryffindor”,
 pet: “Scabbers”,
 patronus: “Jack Russell terrier”
}
const hermione = {
 name: “Hermione Granger”,
 house: “Gryffindor”,
 pet: “Crookshanks”,
 patronus: “Otter”
}
const boundedRon = harry.greeting.bind(ron);
const boundedHermione = harry.greeting.bind(hermione);

Выполним их!

boundedRon(); // “Hello! My name is Ronald Weasley!”
boundedHermione(); // “Hello! My name is Hermione Granger!”

Ключевое слово this внутри функции приветствия проверяет контекст объекта ron, когда он связан с ним. Он проверяет Гермиону, когда она связана с Гермионой.

Ура!

Надеюсь, кому-то это будет понятно.
Спасибо, что прочитали!

Ваше здоровье!