Начав третью неделю программирования на JavaScript, я понимаю и принимаю, что, скорее всего, никогда не узнаю всего этого. Однако есть определенные аспекты, с которыми я продолжаю сталкиваться, которые по-прежнему сбивают меня с толку, например, загадка _proto_ / prototype. Я попытаюсь ответить на эти три вопроса:

  1. Они разные?
  2. Почему люди употребляют говядину с _proto_?
  3. Когда я использую что?

на как можно более простом английском языке.

Как любой хороший студент, я искал определение того и другого, прежде чем перейти к мелочам. К счастью, я наткнулся на множество веб-сайтов, которые были так рады научить меня!

По данным одного сайта:

«__proto__ - это фактический объект, который используется в цепочке поиска для разрешения методов. Это свойство, присущее всем объектам. Это свойство используется движком JavaScript для наследования. Согласно спецификациям ECMA, предполагается, что это внутреннее свойство, однако большинство поставщиков разрешают доступ к нему и изменять его ».

«prototype - собственность, принадлежащая только функциям. Он используется для построения __proto__, когда функция используется как конструктор с ключевым словом new ».

Вы можете подумать: для меня это не имеет смысла. И я согласен! Это также БЕЗ СМЫСЛА ДЛЯ МЕНЯ. Я неохотно иду туда, где я должен был начать: The Docs (MDN). Они сразу же вызвали у меня интерес к драме:

«Использование __proto__ противоречиво и не рекомендуется».

и я счастливо продолжил этот путь.

Хотя мне хотелось бы пройтись по своим вопросам по порядку, The Docs ответили на второе, первое. Судя по всему, люди возражают против использования _proto_, потому что он изначально не был включен в спецификацию языка ECMAScript, а теперь все эти модные и современные браузеры все равно его реализуют! Хотя он устарел!

Разница между _proto_ и prototype невелика, но важна. Если ̶y̶o̶u̶'̶r̶e̶ как я и приближается JavaScript из класса-Based возражал-ориентированный язык, ̶ это может быть немного, чтобы обернуть вокруг головы.

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

Здесь у нас есть эта штука под названием Animal. Прототип животного - это функция-конструктор. Что такое функция-конструктор - это еще одно сообщение в блоге. Но поверьте мне на слово: прототип Animal - это функция-конструктор. При создании функции Animal важно использовать заглавные буквы, чтобы мы могли добавлять к ней новые Animal, например cat. Набрав cat .__ proto__, вы увидите, что это происходит от constructor: f Animal () (Animal function, которая является функцией-конструктором).

Это вызывает вторую причину, по которой людям не нравится использовать __proto__: вы можете вызвать .__ proto__ для объекта и на самом деле изменить прототип этого объекта. наследуется от. Это плохо, потому что мы не хотим превращать __proto__ cat в человека. Это сделало бы ситуацию неловкой.

По сути, вы можете вызвать .__ proto__ для созданного вами объекта и узнать, от какого прототипа он произошел, а также от того, какие свойства он унаследовал. Вы также можете добавлять свойства в cat, не добавляя их в его прототип.

Мой третий вопрос: когда я использую что? Технически у вас нет для использования ни того, ни другого ... но многие используют прототип в своем коде. Если вы хотите добавить отдельное свойство к исходному прототипу, Animal, сделайте это следующим образом:

Как видите, я не добавлял свойство isCute напрямую к cat, но поскольку __proto __ cat > - это f Animal (), а прототип Animal имеет свойство isCute, cat также наследует это свойство .

Вот и все! Я могу с уверенностью сказать, что научился писать это. Я надеюсь, что любой, кто это читает, научился… читая это :).