Начав третью неделю программирования на JavaScript, я понимаю и принимаю, что, скорее всего, никогда не узнаю всего этого. Однако есть определенные аспекты, с которыми я продолжаю сталкиваться, которые по-прежнему сбивают меня с толку, например, загадка _proto_ / prototype. Я попытаюсь ответить на эти три вопроса:
- Они разные?
- Почему люди употребляют говядину с _proto_?
- Когда я использую что?
на как можно более простом английском языке.
Как любой хороший студент, я искал определение того и другого, прежде чем перейти к мелочам. К счастью, я наткнулся на множество веб-сайтов, которые были так рады научить меня!
По данным одного сайта:
«
__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 __ em cat > - это f Animal (), а прототип Animal имеет свойство isCute, cat также наследует это свойство .
Вот и все! Я могу с уверенностью сказать, что научился писать это. Я надеюсь, что любой, кто это читает, научился… читая это :).