ООП в javascript

26
ООП в JavaScript

Upload: enterra-inc

Post on 16-Jun-2015

233 views

Category:

Software


0 download

DESCRIPTION

Презентация "Объектно ориентированое программирование в JavaScript"

TRANSCRIPT

Page 1: ООП в JavaScript

ООП в JavaScript

Page 2: ООП в JavaScript

Создание: Из пустого объекта { }

var person = { };

person.name = ‘Dino’;

person.getName = function () {

return person.name;

};

1

2

3

4

5

Page 3: ООП в JavaScript

Создание: Сразу {…}

var person = { name: ‘Dino’, getName: function () { return this.name; }};

123456

ЗАПЯТАЯЗАПЯТАЯ

Page 4: ООП в JavaScript

Манипуляции• CRUD свойств• Вложенные объекты• Передача по ссылке всегда

myObject.myProperty == myObject[‘myProperty’]

for (myProperty in myObject) {…}

myObject.FOO

myObject.FOO.BAR

myObject.FOO && myObject.FOO.BAR

undefined

undefined

TypeError

Page 5: ООП в JavaScript

Object.prototype

• Добавление свойств во все экземпляры:

Array.prototype.forEach Array.prototype.filterArray.prototype.splice

• При удалении свойства у объекта будет “просвечивать” то же свойство его прототипа

• Расширение встроенных объектов Array, String:

myPerson.prototype.provider = ‘WebStream’

String.prototype.htmlEncodeString.prototype.trimString.prototype.replace

Page 6: ООП в JavaScript

Конструктор: Запись

var Person = function (name) {

this.name = name; this.say = function () { return "I am " + this.name;

};};

123456

Page 7: ООП в JavaScript

Конструктор: Неявные действия

Конструктор может возвращать любой объект

var Person = function (name) { var this = Object.create(Person.prototype); this.name = name; this.say = function () { return ‘I am ‘ + this.name; }; return this;};

1

2345

6

a

b

Page 8: ООП в JavaScript

Отсутствие ‘new’ не ошибка

• constructor - UpperCamelCase• methods - lowerCamelCase

this.member == window.member

=

Page 9: ООП в JavaScript

Конструктор: проверка this

function Person(name) { if (!(this instanceof Person)) { return new Person(name); } this.name = name;}

123456

Page 10: ООП в JavaScript

Приватные свойства: В конструкторе

• Возвращенный объект можно изменить:– возвращать только то, что надо– возвращать копию объекта

Решение – замыкание (closure)

function Person() { var gender = ‘Female’; this.getGender = function () { return gender; };}

123456

Page 11: ООП в JavaScript

Приватные свойства: Без конструктораAnonymous Immediate Function (Анонимное замыкание)

var myPerson = (function () { var gender = ‘Female’; return { getGender: function () { return gender; } };}());

12345678

Page 12: ООП в JavaScript

Статические свойства: Публичные

• Статический метод не запустится на объекте

• Объектный метод не запустится как статический

var Person = function () { };Person.getSpecies = function () { return ‘Homo sapiens’;};

1

2

3

4

Page 13: ООП в JavaScript

Статические & объектные методыvar Person = function (name) { this.name = name;};

Person.getSpecies = function () { var msg = ‘Homo sapiens’; if (this instanceof Person) { msg += ‘, named ‘ + this.name; } return msg;};

Person.prototype.getSpecies = function () { return Person.getSpecies.call(this);};

123

456789

10

111213

Page 14: ООП в JavaScript

Статические свойства: Приватные• разделены между объектами, которые созданы одним конструктором

• не доступны вне конструктора

var Person = (function () { var counter = 0, NewPerson; NewPerson = function () { counter += 1; }; NewPerson.prototype.getCount = function () { return counter; }; return NewPerson;}());

123456789

10

Page 15: ООП в JavaScript

Константы

•ALL_CAPS

• Объект Constant с методами:

–set(name, value)

– isDefined(name)

–get(name)

ИХ НЕТИХ НЕТ

Page 16: ООП в JavaScript

Цепочки объектов (chaining)

myObj.method1(‘hello’).method2().method3(‘world’);

return this;

изящноспециализировано train wreck

Page 17: ООП в JavaScript

Правда о наследовании• Нет классов как класса

• "Функция-конструктор" - более аккуратная замена термина "класс"

• "Экземпляр класса" не имеет того смысла

• Но есть слово «new»

• Object.prototype

• Объекты создаются на основе других объектов

• Объекты - это просто пары «ключ»-«значение»

• “Prefer object composition to class inheritance.” GoF

Page 18: ООП в JavaScript

Наследование классами: Функция inherit(C, P)

КОНСТРУКТОР

PARENTКОНСТРУКТОР

CHILD

НАСЛЕДНИК

inherit (child, parent);

Page 19: ООП в JavaScript

Наследование классами: Обычный способ

function Parent(name) { this.name = name || 'Adam';}Parent.prototype.say = function () { return this.name;};function Child(name) { };

inherit(Child, Parent);

function inherit(C, P) { C.prototype = new P();}

234567

8

910

1

11

• Нет передачи параметров

• Потомку передается весь Родитель,а не его prototype

Page 20: ООП в JavaScript

Наследование классами: Святой Грааль

var inherit = (function () { var F = function () { }; return function (C, P) { F.prototype = P.prototype; C.prototype = new F(); C.uber = P.prototype; C.prototype.constructor = C; }}());

23456789

1

Page 21: ООП в JavaScript

Наследование классами: Картинка

name = Adam

prototype:say()

new Parent()

new F()

prototype

new Child() prototypeconstructor = Child

uber

Page 22: ООП в JavaScript

Наследование классами лучше избегать

• Технически классов в JavaScript не существует

• Путаница в терминологии и реализации

• Подобный подход можно использовать, если разработчик не умеет работать с прототипами, а умеет с классами

• Повторно использовать код можно и без "классического" наследования

Page 23: ООП в JavaScript

Наследование прототипами

Объекты наследуются от объектов

if (typeof Object.beget !== 'function') { Object.beget = function (o) { var F = function () { }; F.prototype = o; return new F(); };}

var anotherPerson = Object.beget(person);

234567

8

1

Page 24: ООП в JavaScript

Наследование копированием свойств

1. shallow copy

2. deep copy

function extend(parent, child) { var i; child = child || { }; for (i in parent) { if (parent.hasOwnProperty(i)) { child[i] = parent[i]; } } return child;}

Prototype не участвуют.Только СОБСТВЕННЫЕ свойства объектов

Page 25: ООП в JavaScript

Одалживание (borrowing) методов

• В методе objFOO.myMethod() вместо this подставляется objBAR

• Нужны только те свойства, которые используются в методе

• Не надо строить иерархию наследования ради нескольких методов

objFOO.myMethod.call(objBAR, param1, p2, p3);

objFOO.myMethod.apply(objBAR, [param1, p2, p3]);

методы объекта «Функция» CALL и APPLY

Page 26: ООП в JavaScript

Спасибо за внимание, вопросы1. Создание: Из пустого объекта { }2. Создание: Сразу {…}3. Манипуляции4. Конструктор: Запись5. Конструктор: Неявные действия6. Отсутствие “new” не ошибка7. Конструктор: проверка this 8. Приватные свойства: В конструкторе9. Приватные свойства: Без конструктора10. Статические свойства: Публичные11. Статические & объектные методы12. Статические свойства: Приватные13. Константы14. Цепочки объектов15. Правда о наследовании16. Наследование классами: Функция inherit(C, P)17. Наследование классами: Обычный способ18. Наследование классами: Святой Грааль19. Наследование классами: Картинка20. Наследование классами лучше избегать21. Наследование прототипами22. Наследование копированием свойств23. Одалживание (borrowing) методов