Слайд 1 - BioRainbow

advertisement
JavaScript и ООП
Валеев Т. Ф.
Прототипно-ориентированное
программирование
• Прототипно-ориентированное программирование или прототипное
программирование — стиль объектно-ориентированного
программирования, при котором отсутствует понятие класса, а
повторное использование (наследование) производится путём
клонирования существующего экземпляра объекта — прототипа.
http://ru.wikipedia.org/wiki/Прототипное_программирование
• Экземпляр объекта по своей сути — хэш, где часть элементов
являются ссылками на функции.
• Новые объекты создаются либо полностью с нуля, либо копированием
существующих объектов с последующим частичным изменением.
• Можно создать несколько «базовых» объектов, из которых будут
копироваться все остальные и мыслить об этих объектах как о классах.
• При делегировании (аналог наследования) можно сохранить часть
функциональности базового объекта.
Создание объекта
• Просто:
var obj = {a: "foo", b: "bar", c: function()
{alert(this.a)}};
• Конструкторы и оператор new:
function MyObject() {…}
var obj = new MyObject();
• Задание прототипа: Object.create(proto);
• Basic RTTI: obj.constructor === MyObject
=> objcreate.html
• Объявление функций снаружи конструктора =>
objexternal.html
• Использование __proto__ — нестандартно
Оператор new
• Вызов new Constructor(args) – грубая схема
– Создаёт новый пустой объект obj
– Устанавливает
obj.__proto__ = Constructor.prototype
– Устанавливает
obj.constructor = Constructor
– Вызывает Constructor.apply(obj, args)
– Возвращает obj или тот объект, который вернул
Constructor.
Вызов методов и bind
• obj.func(args…) => func.call(obj, args…)
• При передаче функции параметром
контекст не сохраняется!
• Выход — bind (карирование!) => bind.html
Объекты и права доступа: замыкания
• Методы объекта являются замыканиями:
им доступен контекст конструктора
• О параметрах и локальных переменных
конструктора можно мыслить как о
приватных членах объекта
( => objclosure.html )
• Так же локальная функция конструктора
может пониматься как приватный метод
• Полиморфизм ( => objpolymorph.html )
Наследование
• У объекта есть системный атрибут prototype,
который, в частности, содержит описание
родительского объекта (прототипа текущего
объекта) ( => subclass.html )
• RTTI: instanceof — проверить, является ли объект
экземпляром данного прототипа.
• Вызов родительского конструктора выполняется
явно: A.call(this); (зачем call?)
• Вызов родительских методов также выполняется
явно: A.prototype.DoIt.call(this);
• Переопределение (расширение) стандартных
объектов => sign.html, function.html
Свойства объектов
• Свойство сперва ищется в самом объекте
• Если не находится там, ищется в
родительском (obj.__proto__) и т. д.
• Если не находится вообще, возвращается
undefined
• У объекта есть метод hasOwnProperty,
указывающий, есть ли свойство в самом
объекте)
• for(var i in obj) {alert(obj[i]);} => forin.html
Конфигурирование свойств
• Object.defineProperty (ECMA5) — задать новое свойство
(object, name, descriptor)
–
–
–
–
–
–
configurable: можно ли изменить дескриптор или удалить свойство
writable: можно ли записать
enumerable: появляется ли оно при обходе через for in.
get: геттер
set: сеттер
value: значение
• property.html
• Дальнейший контроль над объектами:
– Object.freeze(), Object.seal(), Object.preventExtensions()
JSON
•
•
•
•
•
•
JSON (JavaScript Object Notation) - простой формат обмена данными, удобный
для чтения и написания как человеком, так и компьютером. Он основан на
подмножестве языка программирования JavaScript, определенного в
стандарте ECMA-262 3rd Edition - December 1999. JSON - текстовый формат,
полностью независимый от языка реализации)
http://json.org/json-ru.html
Стандарт — ECMA-404 (октябрь 2013)
JSON позволяет представлять вложенные структуры данных (массивы, хэши,
массивы хэшей, хэши массивов и т. д.) в текстовом виде в соответствии с
синтаксисом JavaScript. Результат может разбирать получатель, в том числе
другой язык (не обязательно ECMAScript-совместимый), который преобразует
JSON-строку в свою структуру данных.
В разных языках есть библиотеки для этого.
JSON-строки удобно использовать для обмена данными в AJAX-запросах.
Пример JSON-строки:
{“a”:[1,2,3,4,5,null], “b”:”test”, “c”:1e+9, “d”:{“foo”: “bar”, “num”: 1, “flag”: false}}
lodash.js
• Предыдущая версия — underscore.js
• Унифицирует ряд функций, добавляя polyfill
по необходимости
• Сглаживает различия в реализациях
– parseInt(“025”)?
• Добавляет новые полезные функции
• Взаимодействует с массивами, объектами
• https://lodash.com/docs
Download