А затем прототип де-JavaScript и цепочка прототипов

внешний интерфейс JavaScript
А затем прототип де-JavaScript и цепочка прототипов

«Это 16-й день моего участия в первом испытании обновлений 2022 года. Подробную информацию о мероприятии см.:Вызов первого обновления 2022 г."

предисловие

Хотя JavaScript-прототип и цепочка прототипов — это старая тема, она до сих пор многих сбивает с толку, и сегодня я расскажу об этом вопросе с другой стороны.

два вопроса

Сначала посмотрите на этот фрагмент кода:

let obj = {}
obj.__proto__.haha = 'gogo'
console.log(obj.haha) // "gogo"

Запустите приведенный выше код, выводgogo.

В связи с этим результатом возникают следующие вопросы:

  • откуда взялся объект__proto__Атрибуты?
  • Зачем добавлять в__proto__Можете ли вы получить свойства объекта напрямую?

Первый вопрос

У каждого объекта в js есть "прототип", и прототип вообще можно передать через__proto__Доступ к:

let obj = {}
console.log(obj.__proto__)
// {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}

Это можно понять так:Прототип, также объект.

подобно:

  • У каждого «человека» есть «папа»;
  • Но «папа» — это еще и «человек»;
  • «Папа» ничем принципиально не отличается от других людей, кроме того, что это чей-то отец;
  • Папа тоже нормальный человек.

похожий:

  • «Прототип» — это обычный объект;
  • У папы тоже его папа, и у архетипа есть свой архетип.

второй вопрос

Предметы отличаются от людей тем, что:

  • Ты не можешь просто взять вещи своего отца
  • И объект может принимать все, что есть в прототипе.

Например, когда вы запрашиваете у объекта свойство:

  • Если у объекта нет нужного вам свойства, он даст вам свой прототип (папа)
  • Если у него нет папы, то его папа найдет папу своего папы.

Например следующий пример:

let obj = {
  __proto__: {
    __proto__: {
      haha: 'gogo'
    }
  }
}
console.log(obj.haha) // "gogo"

Потому что сам obj не имеет атрибута хаха, он уйдёт в свой собственный__proto__искать его, если не найдет, то будет__proto__.__proto__ищите, пока не найдете атрибут ха-ха или__proto__цепочка до тех пор, пока не будет возвращено значение null.

Другой способ написать:

let 爷爷 = {
  haha: 'gogo'
}
let 爸爸 = {
  __proto__: 爷爷
}
let obj = {
  __proto__: 爸爸
}
console.log(obj.haha) // "gogo"

Процесс нахождения атрибута ха-ха таков:obj -> 爸爸 -> 爷爷, это похоже на цепь? Это цепочка прототипов.

О прототипе

Есть такая фраза:

Класс — это шаблон для объекта

Мы с вами оба люди, а «люди» — это классы и шаблоны.

Мы с вами оба относимся к категории «людей» и имеем много общего:

  • иметь рот
  • две ноги
  • будет есть
  • буду спать

...

Эти общие черты присущи людям.

Конечно, между вами и мной как самостоятельными объектами должны быть различия, например: меня зовут X, вас зовут Y. Эти различия являются «личными» для объекта.

Посмотрите на фрагмент кода js для создания объекта (обратите внимание на раздел комментариев):

function Person(name) {
  this.name = name
}
Person.prototype.吃饭 = function() {
  console.log('吃吃吃')
}
Person.prototype.睡觉 = function() {
  console.log('睡睡睡')
}

let 我 = new Person('我')
我.吃饭() // "吃吃吃"
console.log(Person.prototype === 我.__proto__) // true
// 可以看出,在实例化的过程中,类的 prototype 成为对象的原型  

let 你 = new Person('你')
你.睡觉() // "睡睡睡"
console.log(我.__proto__ === 你.__proto__) // true
// 同一类的多个实例(对象),共享一个原型?

我.__proto__.吃饭 = function() {
  console.log('再吃一点')
}
console.log(我.吃饭 == 你.吃饭) // true
你.吃饭() // "再吃一点"
// 没错,同一类的多个实例,共享一个原型

По аналогии с человеческим обществом это:

  • Ваши братья и сестры «делят» с вами отца
  • Когда твоему отцу обжигают голову, то же самое происходит и с отцом твоего брата. В этом процессе горят головы не двум отцам одновременно, а одному отцу.

Важные выводы:

  • Во время создания экземпляра (то есть «когда объект новый»)Прототип класса становится прототипом объекта
  • Несколько экземпляров одного и того же класса (так называемых «объектов»), использующих общий прототип

заключительные замечания

Прототип — это нижний слой js, если вы не понимаете прототип, это вряд ли повлияет на вашу работу.

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

~

~ Эта статья окончена, спасибо за прочтение!

~

Получайте интересные знания, встречайте интересных друзей и формируйте интересные души!

Привет всем, я〖Программирование самадхи〗авторКороль-затворник, мой официальный аккаунт "Программирование самадхи』, пожалуйста, обратите внимание, я надеюсь, что вы можете дать мне больше советов!