Skip to content

Instantly share code, notes, and snippets.

@OlehRovenskyi
Created July 5, 2017 11:08
Show Gist options
  • Save OlehRovenskyi/90c53fb9ce88d09cf96e14622f6fa166 to your computer and use it in GitHub Desktop.
Save OlehRovenskyi/90c53fb9ce88d09cf96e14622f6fa166 to your computer and use it in GitHub Desktop.
OOP
// 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