значение" и имеет несколько стандартных методов. Метод объекта в javascript - это просто функция, которая добавлена в ассоциативный массив. 3"> значение" и имеет несколько стандартных методов. Метод объекта в javascript - это просто функция, которая добавлена в ассоциативный массив. 3">
Download presentation
Presentation is loading. Please wait.
Published byHope Cain Modified over 8 years ago
1
1 Объектно-ориентированное программирование на JavaScript Преподаватель: Танаков А.И. Подготовил Д. А. Быстров
2
2 Литература ООП в Javascript: наследование http://javascript.ru/tutorial/object/inheritance http://javascript.ru/tutorial/object/inheritance Стандарт ECMA-262, 3я редакция http://javascript.ru/ecma http://javascript.ru/ecma Прототипное программирование http://ru.wikipedia.org/wiki/Прототипное_программирование http://ru.wikipedia.org/wiki/Прототипное_программирование Большие хитрости JavaScript http://dklab.ru/chicken/nablas/39.html http://dklab.ru/chicken/nablas/39.html
3
Объекты Объект в javascript представляет собой обычный ассоциативный массив ("хэш"). Он хранит любые соответствия "ключ => значение" и имеет несколько стандартных методов. Метод объекта в javascript - это просто функция, которая добавлена в ассоциативный массив. 3
4
Создание объекта var o = new Object() var o = {} 4
5
Добавление свойств и доступ к ним o.test = 5 o["test"] = 5 alert(o.test) alert(o['test']) 5
6
Удаление свойств o.test = 5 delete o.test 6
7
Расширенное создание var o = { test: 5, bla: true } 7
8
var rabbit = {} rabbit.run = function(n) { alert("Пробежал "+n+" метров!") } rabbit.run(5) // Пробежал 5 метров 8
9
Перебор свойств объекта for(var key in object) { // key - название свойства // object[key] - значение свойства... } 9
10
Перебор свойств объекта for(prop in object) { // пропускаем свойства прототипа if ( ! object.hasOwnProperty(prop) ) continue; //... } 10
11
Свойства класса Object сonstructor – ссылка на функцию-конструктор prototype – ссылка на объект-прототип var o = new Complex(1,2); if ((typeof o == "object") && (o.constructor == Complex)){ // точно знаем, что o «класса» Complex } 11
12
Методы класса Object toString() – строковое представление объекта valueOf() – примитивное значение объекта watch() – добавляет точку наблюдения unwatch() – удаляет точку наблюдения hasOwnProperty() – определено ли неунаследованное свойство isPrototypeOf() – является ли свойство объектом-прототипом 12
13
Ключевое слово this как функция func(параметры)this = window как метод obj.func(параметры)this = obj obj[“func”](параметры) apply/call func.apply(obj, [параметры])this = obj func.call(obj, параметры) Конструктор new func (параметры)this = новый объект 13
14
14 В мире животных Animal RabbitBirdHamster
15
15 Прототипное программирование Объект создаётся путём клонирования другого объекта – прототипа Языки программирования: Self, JavaScript, Lua и т.д. Два метода создание объектов: клонирование существующего объекта «с нуля» Делегирование Каскадирование
16
16 Создание объекта. Функция-конструктор function Animal(name) { this.name = name; this.canWalk = true; } var animal = new Animal("скотинка") ; alert( animal.name); // => 'скотинка' alert( animal.canWalk); // => true alert(animal instanceof Animal); // => true
17
17 Кролик – это животное function Rabbit(name) { this.name = name } Rabbit.prototype = animal; big = new Rabbit('Chuk'); small = new Rabbit('Gek'); alert(big.name); // Chuk alert(small.name); // Gek alert(big.canWalk); // true
18
18 Свойство prototype и прототип Скрытое свойство прототип [[prototype]] function Rabbit(name) {…} Rabbit.prototype = animal;
19
19 Перекрытие свойств родителя animal.canWalk = false; small.canWalk = true; alert(big.canWalk); // false; alert(small.canWalk); // true
20
20 Методы объекта Animal.prototype.move = function(n) { this.distance = n; alert(this.distance); } var animal = new Animal("животное"); animal.move(3); // => 3 animal.move(4); // => 4...
21
21 Добавление методов объекту в его конструкторе function Animal(n) { // конструируем объект..... // добавляем методы this.move = function(n) { this.distance = n; alert(this.distance); }
22
22 Свойства неэлементарных типов. Проблема function Hamster() { } Hamster.prototype = { food: [], found: function(something) { this.food.push(something) }
23
23 Свойства неэлементарных типов. Решение function Hamster() { this.food = []; } Hamster.prototype = { food: [], found: function(something) { this.food.push(something) }
24
24 Наследование на классах function Animal(name){…} Animal.prototype = {…} function Rabbit(name){…} Rabbit.prototype = new Animal(); Rabbit.prototype.run = function(..) {... }
25
25 Наследование на классах. Проблема function Animal(name){…} Animal.prototype = {…} function Rabbit(name){…} Rabbit.prototype = new Animal(); Rabbit.prototype.run = function(..) {... }
26
26 Наследование на классах. Функция extend function extend(Child, Parent) { var F = function() { }; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.superclass = Parent.prototype; }
27
27 Функция extend. Использование function Animal(...) {... } Animal.prototype.move = function(…) {…} function Rabbit(...) {... }; extend(Rabbit, Animal); Rabbit.prototype.run = function(...) {... } rabbit = new Rabbit(…); rabbit.move(3); rabbit.run(5);
28
28 Вспомогательный объект F function extend(Child, Parent) { var F = function() { }; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.superclass = Parent.prototype; }
29
29 Меняем F.prototype function extend(Child, Parent) { var F = function() { }; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.superclass = Parent.prototype; }
30
30 Prototype для дочернего класса function extend(Child, Parent) { var F = function() { }; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.superclass = Parent.prototype; } Child.prototype.[[prototype]] = (new F).[[prototype]] = Parent.prototype
31
31 Поправить свойство constructor function extend(Child, Parent) { var F = function() { }; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.superclass = Parent.prototype; } function Z() {} alert(Z.prototype.constructor); // => функция Z z = new Z(); alert(z.constructor); // => функция Z
32
32 Сохранить суперкласс function extend(Child, Parent) { var F = function() { }; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.superclass = Parent.prototype; }
33
33 Вызов родительских методов function Rabbit(…) { … Rabbit.superclass.constructor.apply(this, arguments);... } Rabbit.prototype.move = function(...) { Rabbit.superclass.move.apply(this,...); }
34
34 Оператор instanceOf alert(animal instanceof Animal); // => true Алгоритм оператора instanceOf: function instanceOf(object, constructor) { var o=object; while (o.__proto__ != null) { if (o.__proto__ === constructor.prototype) return true; o = o.__proto__; } return false; }
35
35 Фабрика объектов function Animal(name) { var speed = 10; var me = { name: name, run: function(dist) {return dist / speed;} }; me.constructor = arguments.callee; return me; } pet1 = Animal(); pet2 = Animal();
36
Приватные члены класса function Animal(name, walkSpeed) { // объявить приватную переменную var speed = walkSpeed; // объявить открытую переменную this.distance = 0; // добавить метод, использующий private speed this.walk = function(time) { this.distance = this.distance + time*speed; } …. 36
37
Protected члены класса Нет такого способа для JavaScript Реализуются указанием в названии открытых методов, что их можно использовать только в наследниках, например так: this._protectedMethod = function(…){} 37
38
38 Фабрика объектов function Animal(name) { var speed = 10; var me = { name: name, run: function(dist) {return dist / speed;} }; me.constructor = arguments.callee; return me; } pet1 = Animal(); pet2 = Animal();
39
39 Фабрика объектов function Animal(name) { var speed = 10; var me = { name: name, run: function(dist) {return dist / speed;} }; me.constructor = arguments.callee; return me; } pet1 = Animal(); pet2 = Animal();
40
40 Фабрика объектов function Animal(name) { var speed = 10; var me = { name: name, run: function(dist) {return dist / speed;} }; me.constructor = arguments.callee; return me; } pet1 = Animal(); pet2 = Animal();
41
41 Фабрика объектов. Создание потомка function Rabbit(name) { var me = Animal(name); var jumps = 0; me.jump = function() { jumps++ } me.getJumps = function() { return jumps } me.constructor = arguments.callee; return me }
42
42 Фабрика объектов. Создание потомка function Rabbit(name) { var me = Animal(name); var jumps = 0; me.jump = function() { jumps++ } me.getJumps = function() { return jumps } me.constructor = arguments.callee; return me }
43
43 Фабрика объектов. Создание потомка function Rabbit(name) { var me = Animal(name); var jumps = 0; me.jump = function() { jumps++ } me.getJumps = function() { return jumps } me.constructor = arguments.callee; return me }
44
44 Фабрика объектов. Создание потомка function Rabbit(name) { var me = Animal(name); var jumps = 0; me.jump = function() { jumps++ } me.getJumps = function() { return jumps } me.constructor = arguments.callee; return me }
45
45 Фабрика объектов. Создание потомка function Rabbit(name) { var me = Animal(name); var jumps = 0; me.jump = function() { jumps++ } me.getJumps = function() { return jumps } me.constructor = arguments.callee; return me }
46
46 Фабрика объектов. instanceOf Оператор instanceOf при таком наследовании не работает Проверка на нужный метод if (arr.splice) { … arr.splice(…); … }
47
47 Вызов свойств родителя function Rabbit(name) { var me = animal(name); var jumps = 0; me.jump = function() { jumps++ } me.getJumps = function() { return jumps } var super_run = me.run; me.run = function(distance) { this.jump(); return super_run.call(this, distance); } return me; }
48
48 Вызов свойств родителя function Rabbit(name) { var me = animal(name); var jumps = 0; me.jump = function() { jumps++ } me.getJumps = function() { return jumps } var super_run = me.run; me.run = function(distance) { this.jump(); return super_run.call(this, distance); } return me; }
49
49 Вызов свойств родителя function Rabbit(name) { var me = animal(name); var jumps = 0; me.jump = function() { jumps++ } me.getJumps = function() { return jumps } var super_run = me.run; me.run = function(distance) { this.jump(); return super_run.call(this, distance); } return me; }
50
Множественное наследование function SomeClass(_Arg1, _Arg2){ Parent1.call(this, Arg1); Parent2.call(this, Arg2); // далее, собственные методы и свойства SomeClass } 50
51
51 Вопросы
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.