Расширенные объекты Javascript
Часть 19
Давайте поговорим о некоторых сложных концепциях объектов, хотя я предупреждаю вас, что вряд ли вы сразу их поймете.
С объектами важны три вещи: ссылочный тип, контекст и создание.
Тип ссылки
Как вы думаете, что произойдет, если я это сделаю?
Посмотрим:
Что, если я сделаю это:
Снова давайте посмотрим на ответ:
Как насчет этого?
Теперь, если я пойду:
Что, если я сделаю:
На первый взгляд, object1 и object3 одинаковы; они имеют одинаковую ценность. Тем не менее, когда я говорю, что объект1 равен объекту3, я получаю false.
Давай проверим что-нибудь еще.
Что, если я сделаю:
Теперь, если я проверю значение Object2:
Но если я сейчас проверю значение object3: все равно 10!
Давайте посмотрим, что происходит на самом деле.
см. Диаграмму ниже:
Объекты - это так называемые ссылочные типы в Javascript. Ранее мы видели другие типы javascript (null, числа, строки, логические значения, undefined, символы). Эти непохожие объекты (ссылочные типы) определяются языком программирования (javascript) - они являются примитивными типами.
ссылочный тип, с другой стороны, не является примитивным типом - он не определяется языками программирования - они создаются программистом.
Итак, когда мы говорим переменную
Программа знает 2; Это непреложно.
Однако когда мы это создали:
Это ссылочные типы - они созданы нами. Мы сказали, что хотим, чтобы object1 создал новый объект и сохранил в нем значение 10.
Object2 говорит: я хочу, чтобы вы просто сослались - и отсюда и произошло слово - object1;, означающее «Я хочу, чтобы все, что находится внутри коробки. объект1 создан ».
Но когда создается object3, это новый объект. Он имеет новые скобки и гласит: «Поместите значение 10 в это поле».
Итак, object2 ссылается на object1; object3 создает новый объект.
Итак, наш пример здесь имеет смысл:
Когда мы меняем значение object1 на 15, мы изменяем содержимое Box1 - и, следовательно, значение object2, потому что оно ссылается на то же поле.
Однако значение object3 не меняется, поскольку его интересует совершенно другой блок - Box3.
Теперь массивы - это просто объекты в конце дня. Итак, когда вы создаете массив, это то же самое, что создание блока - структуры данных.
На приведенной выше иллюстрации, по сути, у вас есть два массива - две структуры данных. И, как мы видели с ссылочным типом, они не могут быть одинаковыми .
Контекст
Контекст сильно путается с областью действия ; Если вы помните, мы говорили, что scope создается, когда видит фигурные скобки.
Теперь контекст сообщает вам, где вы находитесь внутри объекта.
Позволь мне объяснить:
Когда мы говорим console.log (this) - обратите внимание, что this является особым миром в Javascript - мы получаем объект window.
Просто чтобы дважды проверить, если я:
И теперь я могу получить доступ к this.alert («привет»):
Здесь я получаю предупреждение, потому что, как мы видели, то, что слева от точки (.) - это объект окна - this - это объект окна.
И почему это важно?
Это важно для создания экземпляра -, о котором мы поговорим дальше. Просто помните, что this относится к тому объекту, внутри которого мы находимся.
Давайте подробнее остановимся на этом:
Поэтому, если я вызываю a, я получаю объект окна, потому что мы сейчас внутри объекта окна.
Чтобы создать новое значение для this, вы должны сделать что-то вроде этого;
Это важно, когда мы выполняем создание экземпляра, то есть когда вы делаете копию объекта и повторно используете код.
Хороший пример - игроки в игре; если вы создаете большую многопользовательскую онлайн-игру с большим количеством игроков - у вас могут быть тролли, чернокнижники - и создание объекта для каждого отдельного игрока потребует много работы и повторения кода.
Чтобы решить эту проблему, вы можете создать экземпляр - вы делаете экземпляры или несколько копий одного объекта игрока.
Допустим, у нас есть класс Player:
Думайте о классе как о чем-то, что я хочу скопировать.
С помощью Constructor, когда вы создаете класс, например, в данном случае Player, каждый раз, когда я делаю копию Player первое, что запускается, - это функция constructor. Конструктор создает два свойства для объекта Player - имя, тип.
Теперь я могу создавать для Player все, что захочу.
Допустим, мы хотим создать такой метод, как Introduction ():
Итак, теперь я говорю, что любой созданный мной игрок всегда сможет представиться, и у него также будут this.name и this.type .
И причина, по которой мы используем здесь this, заключается в том, что при создании Player мы можем получить доступ к свойству name и type.
Итак, теперь, если я хочу создать, скажем, волшебника:
Здесь мы говорим, что хотим, чтобы wizard расширил все, что есть у Player - поэтому добавьте поверх всего, что Player имеет.
Но обратите внимание, что каждый раз, когда мы что-то расширяем, мы должны вызывать super со свойствами, которые мы передаем конструктору (name, type). Мы хотим иметь возможность вызывать функция constructor player.
А так как это класс, мы должны создать конструктор, в этом случае принимающий имя, тип.
Теперь предположим, что с помощью мастера мы также хотим иметь функцию play.
Теперь у нас есть Wizard, и мы можем легко создавать разных мастеров вместо того, чтобы постоянно создавать Players, а затем создавать своих собственных мастеров, которые могут играть.
Ладно, давайте здесь все пройдемся.
У нас есть класс Player, а затем класс Wizard, расширяющий Player.
И затем у нас есть две переменные, которые мы создали wizard1 и Wizard2.
Теперь программа увидит ключевое слово new, и каждый раз, когда она увидит ключевое слово new, она скажет: о! мы создаем нового мастера, и этот мастер будет иметь два параметра: Shelly и Healer.
Итак, он снова перейдет к Wizard классу, потому что в нем есть это новое слово; он говорит: «Эй! Wizard Я хочу, чтобы вы расширили Player ».
Итак, он перейдет к конструктору, и он увидит super, и что он делает, это переносит нас к конструктору Player.
На этом этапе this является мастером, а функция new добавляет функцию play.
Теперь, если я перейду к wizard1 и скажу play, я получу «WEEEEEEE, я целитель».