SlideShare a Scribd company logo
ООП в JavaScript
Создание: Из пустого объекта { } 
var person = { }; 
person.name = ‘Dino’; 
person.getName = function () { 
return person.name; 
}; 
1 
2 
3 
4 
5
Создание: Сразу {…} 
var person = { 
name: ‘Dino’, 
getName: function () { 
return this.name; 
} 
}; 
123456 
ЗЗААППЯЯТТААЯЯ
Манипуляции 
• CRUD свойств 
• Вложенные объекты 
• Передача по ссылке всегда 
myObject.myProperty == myObject[‘myProperty’] 
myObject.FOO 
myObject.FOO.BAR 
myObject.FOO && myObject.FOO.BAR 
undefined 
TypeError 
undefined 
for (myProperty in myObject) {…}
Object.prototype 
• Добавление свойств во все экземпляры: 
myPerson.prototype.provider = ‘WebStream’ 
•Расширение встроенных объектов Array, String: 
Array.prototype.forEach 
Array.prototype.filter 
Array.prototype.splice 
String.prototype.htmlEncode 
String.prototype.trim 
String.prototype.replace 
•При удалении свойства у объекта будет 
“просвечивать” то же свойство его прототипа
Конструктор: Запись 
var Person = function (name) { 
this.name = name; 
this.say = function () { 
return "I am " + this.name; 
}; 
}; 
123456
Конструктор: Неявные действия 
var Person = function (name) { 
var this = Object.create(Person.prototype); 
this.name = name; 
this.say = function () { 
return ‘I am ‘ + this.name; 
}; 
return this; 
}; 
Конструктор может возвращать любой объект 
1 
a 
2345 
b 
6
Отсутствие ‘new’ не ошибка 
= 
this.member == window.member 
• constructor - UpperCamelCase 
• methods - lowerCamelCase
Конструктор: проверка this 
function Person(name) { 
if (!(this instanceof Person)) { 
return new Person(name); 
} 
this.name = name; 
} 
123456
Приватные свойства: В конструкторе 
Решение – замыкание (closure) 
function Person() { 
var gender = ‘Female’; 
this.getGender = function () { 
return gender; 
}; 
} 
• Возвращенный объект можно изменить: 
– возвращать только то, что надо 
– возвращать копию объекта 
1 
2345 
6
Приватные свойства: Без конструктора 
Anonymous Immediate Function (Анонимное замыкание) 
var myPerson = (function () { 
var gender = ‘Female’; 
return { 
getGender: function () { 
return gender; 
} 
}; 
}()); 
1 
2345 
678
Статические свойства: Публичные 
var Person = function () { }; 
Person.getSpecies = function () { 
return ‘Homo sapiens’; 
}; 
1 
2 
3 
4 
• Статический метод не запустится на объекте 
• Объектный метод не запустится как статический
Статические & объектные методы 
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 
11 
12 
13
Статические свойства: Приватные 
• разделены между объектами, которые созданы одним конструктором 
• не доступны вне конструктора 
var Person = (function () { 
var counter = 0, NewPerson; 
NewPerson = function () { 
counter += 1; 
}; 
NewPerson.prototype.getCount = function () { 
return counter; 
}; 
return NewPerson; 
}()); 
123456789 10
Константы 
• ALL_CAPS 
ИХ НЕТ 
• Объект Constant с методами: 
–set(name, value) 
– isDefined(name) 
–get(name)
Цепочки объектов (chaining) 
myObj.method1(‘hello’).method2().method3(‘world’); 
return this; 
изящно 
специализировано train wreck
Правда о наследовании 
• Нет классов как класса 
• "Функция-конструктор" - более аккуратная замена 
термина "класс" 
• "Экземпляр класса" не имеет того смысла 
• Но есть слово «new» 
• Object.prototype 
• Объекты создаются на основе других объектов 
• Объекты - это просто пары «ключ»-«значение» 
• “Prefer object composition to class inheritance.” GoF
Наследование классами: Функция inherit(C, P) 
КОНСТРУКТОР 
PARENT 
КОНСТРУКТОР 
CHILD 
inherit (child, parent); 
НАСЛЕДНИК
Наследование классами: Обычный способ 
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(); 
} 
1 
234567 
8 
9 
10 
11 
• Нет 
передачи 
параметров 
• Потомку 
передается 
весь 
Родитель, 
а не его 
prototype
Наследование классами: Святой Грааль 
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; 
} 
}()); 
1 
23456789
Наследование классами: Картинка 
new Parent() 
name = Adam 
prototype: 
say() 
new F() 
prototype 
new Child() prototype 
constructor = Child 
uber
Наследование классами лучше избегать 
• Технически классов в JavaScript не существует 
• Путаница в терминологии и реализации 
• Подобный подход можно использовать, если 
разработчик не умеет работать с прототипами, а 
умеет с классами 
• Повторно использовать код можно и без 
"классического" наследования
Наследование прототипами 
if (typeof Object.beget !== 'function') { 
Object.beget = function (o) { 
var F = function () { }; 
F.prototype = o; 
return new F(); 
}; 
} 
var anotherPerson = Object.beget(person); 
Объекты наследуются от объектов 
1 
234567 
8
Наследование копированием свойств 
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 не участвуют. 
Только СОБСТВЕННЫЕ свойства объектов
Одалживание (borrowing) методов 
методы объекта «Функция» CALL и APPLY 
objFOO.myMethod.call(objBAR, param1, p2, p3); 
objFOO.myMethod.apply(objBAR, [param1, p2, p3]); 
• В методе objFOO.myMethod() вместо this 
подставляется objBAR 
• Нужны только те свойства, которые используются в 
методе 
• Не надо строить иерархию наследования ради 
нескольких методов
Спасибо за внимание, вопросы 
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) методов

More Related Content

PPTX
Объекты в ECMAScript | Odessa Frontend Meetup #16
PDF
Влад Ковташ — Yap Database
PDF
Groovy jug-moscow-part 1
PDF
Mockist vs Classicist
PPTX
Поговорим о JavaScript, основы и современные тенденции развития языка
PDF
Spring data jee conf
PPTX
XPath локаторы в Selenium WebDriver
PDF
JavaScript. Basics (in russian)
Объекты в ECMAScript | Odessa Frontend Meetup #16
Влад Ковташ — Yap Database
Groovy jug-moscow-part 1
Mockist vs Classicist
Поговорим о JavaScript, основы и современные тенденции развития языка
Spring data jee conf
XPath локаторы в Selenium WebDriver
JavaScript. Basics (in russian)

What's hot (19)

PPT
Yii development
PPSX
Модульный объект: как это работает в «Аллодах Онлайн».
PPTX
Selenium: начало работы
PDF
2-е занятие курса iPhone разработки в ГУ-ВШЭ
PDF
Spring puzzlers 2
PDF
Ecma script 6 in action
PDF
13 - Web-технологии. Отображение данных
PDF
12 - Web-технологии. Django модели
PPTX
C#. От основ к эффективному коду
PPT
Подробная презентация JavaScript 6 в 1
PPTX
Kotlin with API tests
PDF
Spring puzzlers
PPT
Подробная презентация JavaScript 6 в 1
PDF
Язык программирования Scala / Владимир Успенский (TCS Bank)
PPTX
Selenium vs AJAX
PPT
Толстая модель. История разработки ORM
PPT
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
PPTX
ODP
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Yii development
Модульный объект: как это работает в «Аллодах Онлайн».
Selenium: начало работы
2-е занятие курса iPhone разработки в ГУ-ВШЭ
Spring puzzlers 2
Ecma script 6 in action
13 - Web-технологии. Отображение данных
12 - Web-технологии. Django модели
C#. От основ к эффективному коду
Подробная презентация JavaScript 6 в 1
Kotlin with API tests
Spring puzzlers
Подробная презентация JavaScript 6 в 1
Язык программирования Scala / Владимир Успенский (TCS Bank)
Selenium vs AJAX
Толстая модель. История разработки ORM
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Ad

Similar to ООП в JavaScript (20)

PPTX
JavaScript как объектно-ориентированный язык программирования
PDF
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
PDF
new JavaScript
PDF
Объектное и прототипное программирование в Javascript
PDF
Survive with OOP
PDF
JavaScript. OOP (in russian)
PDF
JavaScript. Loops and functions (in russian)
PDF
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
PDF
Выжить с помощью ООП. Максим Гопей
PPTX
I tmozg js_school_jquery
PPTX
функции в Java script
PDF
Михаил Давыдов: JavaScript. Базовые знания
PPT
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
PDF
Школа-студия разработки для iOS. Лекция 4. Работа с данными
PDF
Фундаментальные основы разработки под iOS. Павел Тайкало
PDF
Squeek 1
PDF
Web internship java script
PDF
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
PDF
PVS-Studio в 2021 - Примеры ошибок
PPTX
Классы и объекты в Java
JavaScript как объектно-ориентированный язык программирования
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
new JavaScript
Объектное и прототипное программирование в Javascript
Survive with OOP
JavaScript. OOP (in russian)
JavaScript. Loops and functions (in russian)
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
Выжить с помощью ООП. Максим Гопей
I tmozg js_school_jquery
функции в Java script
Михаил Давыдов: JavaScript. Базовые знания
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Фундаментальные основы разработки под iOS. Павел Тайкало
Squeek 1
Web internship java script
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
PVS-Studio в 2021 - Примеры ошибок
Классы и объекты в Java
Ad

More from enterra-inc (6)

PPT
Enterra Inc presentation
PDF
Windows Phone Portfolio
PPT
Презентация компании Энтерра
PDF
Портфолио на Windows Phone
PDF
Портфолио на iOS
PDF
Портфолио работ на Android
Enterra Inc presentation
Windows Phone Portfolio
Презентация компании Энтерра
Портфолио на Windows Phone
Портфолио на iOS
Портфолио работ на Android

ООП в JavaScript

  • 2. Создание: Из пустого объекта { } var person = { }; person.name = ‘Dino’; person.getName = function () { return person.name; }; 1 2 3 4 5
  • 3. Создание: Сразу {…} var person = { name: ‘Dino’, getName: function () { return this.name; } }; 123456 ЗЗААППЯЯТТААЯЯ
  • 4. Манипуляции • CRUD свойств • Вложенные объекты • Передача по ссылке всегда myObject.myProperty == myObject[‘myProperty’] myObject.FOO myObject.FOO.BAR myObject.FOO && myObject.FOO.BAR undefined TypeError undefined for (myProperty in myObject) {…}
  • 5. Object.prototype • Добавление свойств во все экземпляры: myPerson.prototype.provider = ‘WebStream’ •Расширение встроенных объектов Array, String: Array.prototype.forEach Array.prototype.filter Array.prototype.splice String.prototype.htmlEncode String.prototype.trim String.prototype.replace •При удалении свойства у объекта будет “просвечивать” то же свойство его прототипа
  • 6. Конструктор: Запись var Person = function (name) { this.name = name; this.say = function () { return "I am " + this.name; }; }; 123456
  • 7. Конструктор: Неявные действия var Person = function (name) { var this = Object.create(Person.prototype); this.name = name; this.say = function () { return ‘I am ‘ + this.name; }; return this; }; Конструктор может возвращать любой объект 1 a 2345 b 6
  • 8. Отсутствие ‘new’ не ошибка = this.member == window.member • constructor - UpperCamelCase • methods - lowerCamelCase
  • 9. Конструктор: проверка this function Person(name) { if (!(this instanceof Person)) { return new Person(name); } this.name = name; } 123456
  • 10. Приватные свойства: В конструкторе Решение – замыкание (closure) function Person() { var gender = ‘Female’; this.getGender = function () { return gender; }; } • Возвращенный объект можно изменить: – возвращать только то, что надо – возвращать копию объекта 1 2345 6
  • 11. Приватные свойства: Без конструктора Anonymous Immediate Function (Анонимное замыкание) var myPerson = (function () { var gender = ‘Female’; return { getGender: function () { return gender; } }; }()); 1 2345 678
  • 12. Статические свойства: Публичные var Person = function () { }; Person.getSpecies = function () { return ‘Homo sapiens’; }; 1 2 3 4 • Статический метод не запустится на объекте • Объектный метод не запустится как статический
  • 13. Статические & объектные методы 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 11 12 13
  • 14. Статические свойства: Приватные • разделены между объектами, которые созданы одним конструктором • не доступны вне конструктора var Person = (function () { var counter = 0, NewPerson; NewPerson = function () { counter += 1; }; NewPerson.prototype.getCount = function () { return counter; }; return NewPerson; }()); 123456789 10
  • 15. Константы • ALL_CAPS ИХ НЕТ • Объект Constant с методами: –set(name, value) – isDefined(name) –get(name)
  • 16. Цепочки объектов (chaining) myObj.method1(‘hello’).method2().method3(‘world’); return this; изящно специализировано train wreck
  • 17. Правда о наследовании • Нет классов как класса • "Функция-конструктор" - более аккуратная замена термина "класс" • "Экземпляр класса" не имеет того смысла • Но есть слово «new» • Object.prototype • Объекты создаются на основе других объектов • Объекты - это просто пары «ключ»-«значение» • “Prefer object composition to class inheritance.” GoF
  • 18. Наследование классами: Функция inherit(C, P) КОНСТРУКТОР PARENT КОНСТРУКТОР CHILD inherit (child, parent); НАСЛЕДНИК
  • 19. Наследование классами: Обычный способ 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(); } 1 234567 8 9 10 11 • Нет передачи параметров • Потомку передается весь Родитель, а не его prototype
  • 20. Наследование классами: Святой Грааль 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; } }()); 1 23456789
  • 21. Наследование классами: Картинка new Parent() name = Adam prototype: say() new F() prototype new Child() prototype constructor = Child uber
  • 22. Наследование классами лучше избегать • Технически классов в JavaScript не существует • Путаница в терминологии и реализации • Подобный подход можно использовать, если разработчик не умеет работать с прототипами, а умеет с классами • Повторно использовать код можно и без "классического" наследования
  • 23. Наследование прототипами if (typeof Object.beget !== 'function') { Object.beget = function (o) { var F = function () { }; F.prototype = o; return new F(); }; } var anotherPerson = Object.beget(person); Объекты наследуются от объектов 1 234567 8
  • 24. Наследование копированием свойств 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 не участвуют. Только СОБСТВЕННЫЕ свойства объектов
  • 25. Одалживание (borrowing) методов методы объекта «Функция» CALL и APPLY objFOO.myMethod.call(objBAR, param1, p2, p3); objFOO.myMethod.apply(objBAR, [param1, p2, p3]); • В методе objFOO.myMethod() вместо this подставляется objBAR • Нужны только те свойства, которые используются в методе • Не надо строить иерархию наследования ради нескольких методов
  • 26. Спасибо за внимание, вопросы 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) методов