Если вы не пытаетесь придерживаться строгого процедурного программирования в Javascript, иногда может возникнуть необходимость в том, чтобы у вас было общее состояние между различными экземплярами объектов одного и того же класса.
Javascript — это язык, основанный на прототипах (подробнее о языки, основанные на прототипах), а классы в Javascript на самом деле являются функциями, которые используют свойство, называемое прототипом, для реализации наследования для объектно-ориентированного программирования. Давайте рассмотрим это на примерах:
Пример 1:
function Animal(name, sound) { this.name = name ? name : this.name; this.sound = sound ? sound : this.sound; } Animal.prototype.introduce = function() { return this.sound + "! I am a " + this.name; } var animal = new Animal("Dog", "Woof"); console.log(animal.introduce()); // Woof! I am a Dog.
Пример 2:
Class Animal { constructor(name, ) { this.name = name; this.sound = sound; } introduce() { return this.sound + "! I am a " + this.name; } } var animal = new Animal("Dog", "Woof"); console.log(animal.introduce()); // Woof! I am a Dog.
Хотя синтаксически они различаются, оба приведенных выше кода внутренне практически одинаковы. Класс Animal {…}в Примере 2 автоматически присваивает внутренние определения прототипу. переменной Animal. Именно этот объект прототип содержит функцию конструктора и другие свойства ( функции и переменные ), которые могут быть явно назначается на основе требований. Вот хорошее подробное чтение по теме Классы в Javascript.
Функция конструктор указывает на Animal, которая в основном позволяет вам создавать экземпляры (или точно копировать) Animal. Теперь, когда вы делаете что-то вроде этого:
var animal = new Animal("Dog", "Woof");
переменная экземпляра является копией Animal, которая содержит объект _proto_, указывающий на прототип элемента Животное. Если вы еще не поняли, к чему все идет, позвольте мне сказать прямо здесь:
Свойство прототипа объекта Javascript является общим для всех экземпляров/копий объекта и может использоваться для хранения общих данных/состояния.
Когда вы пытаетесь получить доступ к свойству объекта с помощью this, механизм Javascript сначала ищет свойство в собственных свойствах экземпляра. Если он не найден, механизм возвращается к объекту _proto_, также известному как dunder proto, для поиска свойства в прототипобъект. Эта цепочка продолжается до самого верхнего предка, если только _proto_не равно null.
Свойства в прототипеможно переопределить с помощью простого присваивания с использованием this для объекта, чтобы он имел собственные значения.
Хорошо, тогда давайте прекратим эту сложную (или не очень) болтовню и перейдем к некоторому коду, чтобы продемонстрировать, как вы можете использовать прототип объекта в Javascript для обмена данными/состоянием. Ниже приведена суть кода. Вы также можете возиться с этим JS Bin.
Что ж, надеюсь, это действительно поможет, так как понимание всего 'все является объектом' в javascript может немного сбить с толку новичков в некоторых сценариях.
Спасибо, что дочитали до конца :) Продолжайте и покажите свою прототипированную человеческую признательность с помощью хлопков, если вы нашли это полезным, и не забудьте подписаться, если вы ожидаете большего.
С Рождеством!!