Created
July 5, 2017 11:08
-
-
Save OlehRovenskyi/90c53fb9ce88d09cf96e14622f6fa166 to your computer and use it in GitHub Desktop.
OOP
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// this | |
// 1. Шаблон вызова функции | |
var sum = function(a, b) { | |
console.log(this); // window | |
return a + b; | |
} | |
console.log(sum(1, 2)); | |
// исправим контекст вызова и перейдем к OOP | |
// 2. Шаблон вызова метода | |
var APP = { | |
sum: function(a, b) { | |
console.log(this); // APP obj (Object {sum: function}) | |
return a + b; | |
} | |
} | |
console.log(APP.sum(1, 2)); | |
// private and public method | |
// Pattern Module | |
var APP = (function() { | |
// private method | |
var funcPrivate = function() { | |
console.log('private method'); | |
}; | |
// public method | |
return { | |
sum: function(a, b) { | |
console.log(this); // APP obj (Object {sum: function}) | |
// приватный метод видным не будет | |
return a + b; | |
}, | |
callPrivateMethod: funcPrivate, | |
callPrivateMethod2: function() { | |
funcPrivate(); | |
} | |
} | |
})(); | |
console.log(APP.sum(1, 2)); | |
console.log(APP.funcPrivate()); // undefined | |
console.log(APP.callPrivateMethod()); | |
console.log(APP.callPrivateMethod2()); | |
// вызов функции в методе обьекта | |
var APP = (function() { | |
// public method | |
return { | |
sum: function(a, b) { | |
console.log(this); | |
var helperFunc = function(a, b) { | |
console.log('helperFunc this: ', this); // window | |
this.multiply = a * b; // будет в window.multiply | |
}; | |
helperFunc(a, b); | |
return a + b; | |
} | |
} | |
})(); | |
console.log(APP.sum(1, 2)); | |
// fix this problem | |
var APP = (function() { | |
return { | |
sum: function(a, b) { | |
var that = this; // кешируем this (можем еще назвать self) | |
var helperFunc = function(a, b) { | |
console.log('helperFunc this: ', that); // хороший пример hosting | |
that.multiply = a * b; | |
}; | |
helperFunc(a, b); | |
return a + b; | |
} | |
} | |
})(); | |
console.log(APP.sum(1, 2)); | |
// 3. Шаблон подмена контекста call/apply | |
var add = function(a, b) { | |
console.log(this); | |
return a + b; | |
} | |
var sum = add.apply(null, [1, 3]) // null для глобального контекста | |
console.log(sum); | |
var sum = add.apply(APP, [1, 3]) // null для глобального контекста | |
console.log(sum); // !!!!!!!! в sum доступны методы APP | |
// !!!!!!!!!!!! | |
var add = function(a, b) { | |
console.log(this.sum(1, 3)); | |
return a + b; | |
} | |
var sum = add.apply(APP, [1, 3]) // null для глобального контекста | |
console.log(sum); // в sum доступны методы APP | |
// 4. Шаблон вызова constructor (new) | |
// литерал obj | |
var obj = {}; | |
// когда нужно создавать однотипные obj | |
var Func = function() {}; | |
new Func() // делаем функцию constructor | |
var Func = function() { | |
this.name = 'Arni'; | |
}; | |
new Func() // делаем функцию constructor | |
// при вызове constructor создаетсяя obj | |
var Man = function(name, age) { | |
this.name = name; | |
this.age = age; | |
this.canSpeak = true; | |
} | |
var arni = new Man('Arni', 30); | |
console.log(arni); | |
// под капотом данная функция constructor возвращает this | |
// рассмотрим случай | |
var Man = function(name, age) { | |
this.name = name; | |
this.age = age; | |
this.canSpeak = true; | |
return { | |
name: 'Sharts' | |
} | |
} | |
var arni = new Man('Arni', 30); | |
console.log(arni); // { name: 'Sharts' } | |
// также можем добавлять методы | |
var Man = function(name, age) { | |
this.name = name; | |
this.age = age; | |
this.canSpeak = true; | |
this.sayHello = function () { | |
return 'Hello ' + this.name; | |
}; | |
} | |
var arni = new Man('Arni', 30); | |
console.log(arni.sayHello()); | |
// private variable | |
var Man = function(name, age) { | |
var priv = 34; // private variable | |
this.name = name; | |
this.age = age; | |
this.canSpeak = true; | |
this.sayHello = function () { | |
console.log('show private variable: ', priv); | |
return 'Hello ' + this.name; | |
}; | |
} | |
// prototype ссылка на другой обьект | |
Man.prototype.sayHowOld = function() { | |
return 'I am ' + this.age + ' old.'; | |
}; | |
// !!!!!!! нет доступа к приватным переменным | |
var arni = new Man('Arni', 30); | |
console.log(arni.sayHowOld()); | |
// !!!!через obj | |
var APP = { | |
Man: function(name, age) { | |
this.name = name; | |
this.age = age; | |
this.canSpeak = true; | |
} | |
} | |
var arni2 = new APP.Man('Arni', 30); | |
console.log(arni); | |
// проверка свойст от которого obj были созданы | |
console.log(arni2 instanceof Man); // false | |
console.log(arni2 instanceof APP.Man); // true | |
// constructor | |
console.log('arni', arni.constructor); | |
console.log('arni2', arni2.constructor); | |
console.log(arni.hasOwnProperty('name')); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment