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