В попередньому обговоренні, ми дізналися, про те як зробити тип об'єкта для подання
наших двох Вінстонів як об'єктів
а потім встановили їх з конструкторами.
Тепер, тип об'єкта не тільки повинен бути пов'язаним з властивостями
Це також може пов'язуватись з функціональністю. Подумайте про світ і всі
типи об'єктів в ньому
як про нас, людей. У всіх нас є рісті вік, але є те, що ми можемо робити, це спати,
смачно поїсти, і програмувати.
І ми хочемо бути в змозі зв'язати ці функції з тими типами об'єктів.
У цій програмі, де ми зупинилися минулого разу, ми маємо функцію тут,
drawWinston, що ми викликаємо по обох об'єктах Вінстон. Чи Не було б здорово,
якщо б ми могли просто прикріпити це
до типу об'єкта Вінстон. Ну ми можемо, і це легко зробити.
Тому, під нашим конструктором, ми введемо Winston.prototype велика W
і prototype, це нове слово, яке ви, ймовірно, не бачили
І прототип це властивість об'єкта, до якого ми можемо приєднати функції
і це буде означати, що кожен об'єкт, який є екземпляром, матиме ці функції.
Отже, ми можемо ввести ".prototype.", а потім ім'я функції, тому ми вводимо "draw"
рівне, і тоді ми можемо взяти наш drawWinston код і ми можемо покласти його
перемістити його всередину сюди. Добре так що тепер, що ми додали функцію draw
до нашого Winston prototype. А це значить, ми повинні бути в змозі викликати draw()
будь-якого типу об'єкта Вінстон
Гаразд, отже, ми повинні бути в змозі викликати draw () по
winstonTeen або winstonAdult.
І коли у нас є функція, як ця, то ми можемо викликате по об'єкті,
ми фактично називаємо це "метод" так що ви можете чути як я кажу "метод"зараз.
Гаразд, скажемо це " метод відображення" Гаразд.
Отже, тепер ми видалимо це, і ось це і тепер побачимо чи ми можемо викликати
draw() winstonTeen.draw()
Гаразд. У нас помилка, що стирчить тут, і вона говорить: "winstObject не визначений"
І перш ніж, ми пропустимо цей аргумент в drawWinston, що був об'єктом Вінстон
але тепер ми не пропускаємо його отже, ми могли б змінити це, щоб пропускати.
а тоді, ми подивимося, чи проходимите тут? Ми слід би пропустити winstonTeen. Гаразд.
Спрацювало, але це, здається, теж не дуже розумно. Я і так вже викликаю draw на
самому об'єкті.
Це не повинно пройти в об'єкті також. Це здається зайвим.
І це правда, ми не повинні робити це, так що видалимо це тут, а тепер подумаємо.
Якщо ми всередині об'єкту, що використати щоб мати доступ до властивостей об'єкту?
ви можете поглянути на наш конструктор і пам'ятаєте спеціальне ключове слово "this"
"А, якщо ми просто змінимо це, на ось це! Отже, ми міняємо winstObject на "this".
Так як ми знаходимося всередині об'єкту прямо зараз. Ця функція обраховується
відповідно об'єкту, отже, "this" відноситиметься до цього поточного об'єкту
І так, спосіб, яким ми можемо просто сказати: "this", і ми отримаємо доступ до
всіх властивостей цього поточного об'єкту
І це повністю працює, бачите? Чи не круто? І тепер можемо ввести WinstonAdult.draw()
І це матиме доступ до властивостей winston Adult так як це об'єкт, що виклкається.
Ось це дійсно здорово про "This" ключове слово, хоча це іноді заплутує коли говориш
Добре, що ж було весело, тому додамо ще один метод. І що ще може робити Вінстон?
Можливо він розкаже. Тому, зробимо Winston .prototype.talk тому, ми можемо додати
стільки методів скільки хочем до прототипу
Так що ми скажемо: "Я Вінстон!"
І тоді ми просто введемо this.x+20,і this.y+150.
А в результаті, нічого не сталося, але, звичайно, це тому, що я ще не
викликаю цю функцію.
Отже, зробимо щоб підліток говорив winstonTeen.talk() [нерозбірливо] говорить
весь час, гаразд.
Я Вінстон. А потім winstonAdult.talk ()
Добре, тепер маємо цей тип об'єкту Вінстон що має властивості: прізвисько,
вік, х, у; і він має функціональності: способи, методи; які діють по-різному
в залежності від властивостей
і ми можемо створити стільки екземплярів Вінстона, скільки ми хочемо, і викликати
за одним з цих методів на ньому.
Досить круто, так?