function drawPlaces(json, section) {
let container;
let circleClass;
let statusObj;
switch (section) {
case "VIP":
container = "#VIP_0020parter";
break;
case "Партер":
container = "#parter";
break;
case "Бельэтаж":
container = "#belletaj";
break;
case "Балкон":
container = "#balcony";
break;
}
for (let item of JSON.parse(json)) {
switch (item.status) {
case "Забронировано":
circleClass = "reserved"
break;
case "В обработке":
circleClass = "reserved"
break;
case "Куплено":
circleClass = "closed";
break;
}
$(container).find(`[tc-row-no=${item.row}]`).find(`[tc-seat-no=${item.col}]`).addClass(circleClass);
}
}
String {0: "о", length: 1, [[PrimitiveValue]]: "о"}
const obj = {
name: "Alex",
gender: "male"
};
const arr = [1, 2, 3, 4, 5];
alert(obj); // [object Object]
alert(arr); // 1, 2, 3, 4, 5 // Перезаписанный метод toString();
// Тоже самое
alert(Object.prototype.toString.call(obj)) // [object Object] (obj.toString());
alert(Array.prototype.toString.call(arr)) // 1, 2, 3, 4, 5 (arr.toString());
const Super = function(superProp) {
this.superProp = superProp;
};
// Присваивать prototype объект не нужно.
// Нужно только добавлять данные,
// иначе прототип будет перезаписан на обычный объект,
// у которого нет свойств которые содержит prototype по умолчанию
Super.prototype.superMethod = function() {
console.log("I am Super Class");
};
// Так делать не нужно - Super.prototype = {
// some code
// };
// Super.prototype = { После добавления свойств в prototype, он будет выглядеть примрно так
// constructor: Super, // свойства по умолчанию
// __proto__: Object.prototype, // default
// superMethod: function() {
// // some code
// }
// };
const SubClass = function(subProp) {
Super.apply(this, arguments); // Вызов конструктора супер класса
this.subProp = subProp;
// __proto__ = Super.prototype;
}
SubClass.prototype = Object.create(Super.prototype); // Создаем объект прототипа на основе прототипа супер класса
SubClass.prototype.constructor = SubClass; // Перезаписываем свойство constructor
SubClass.prototype.subMethod = function() {
console.log("I am subClass");
};
const something = {
method() {
let variable = false;
// Неявно возвращается undefined
// return undefined;
}
};
something.method().variable = true; // undefined.variable = true
// error (Cannot set property "variable" of undefined)
console.log(something.method().variable); // Этот вывод вообще не выполнится
class EventEmitter {
constructor() {
this.listeners = {};
}
on(event, cb) {
this.listeners[event] = this.listeners[event] || [];
this.listeners[event].push(cb);
}
emit(event) {
for (let cb of this.listeners[event]) {
cb();
}
}
}
class User extends EventEmitter {
constructor(name) {
super();
this.name = name;
}
}
const user = new User("Alex");
user.on("greeting", () => {
console.log("Hello " + user.name);
});
user.on("farewell", () => {
console.log("Bye bye " + user.name);
});
setTimeout(() => {
user.emit("greeting"); // Hello Alex
}, 3000);
setTimeout(() => {
user.emit("farewell"); // Bye bye Alex
}, 6000);
const sun = new class { // singleton...
constructor(color, isBig) {
this.color = "yellow";
this.isBig = true;
}
}();
function createSunSingleton() {
var instance; // замыкание...
return function() {
if (typeof instance === "object") return instance;
this.color = 'yellow';
this.isBig = true;
instance = this;
}
}
var Sun = createSunSingleton();
var sun1 = new Sun;
Sun.instance = null;
var sun2 = new Sun;
console.log(sun1 === sun2) // true
// Слушаем событие клика на всем контейнере.
document.querySelector("#messages-container").addEventListener("click", event => { // Делегирование...
if (event.target.classList.contains("remove-button")) { // Если элемент на который кликнули внутри контейнера имеет класс remove-button
event.target.parentNode.remove(); // то удаляем родительский элемент кнопки
}
}, false);
// Можно и так...
for (let button of document.querySelectorAll(".remove-button")) {
button.addEventListener("click", event => {
button.parentNode.remove();
}, false);
}
// Ну или так...
document.querySelectorAll(".remove-button").forEach(button => button.addEventListener("click", () => button.parentNode.remove(), false));
var i = 10;
var array = [];
while (i--) {
array.push(function() {
return i + i;
});
}
array.forEach(item => console.log(item())); // 10 раз напечатается -2
// после выхода из цикла i = -1; И так как i является "глобальной", то все функции будут "ссылаться" на одно и тоже значение после цикла
// array[function() { return i + i; }, function() { return i + i }, function() { return i + i }, ...]
// ==> array[function() { return -1 + -1 }, function() { return -2 }, ...]
// ==> array[0]() ==> return -2;
// ------------------------------------------------------
// Проблему можно решить так:
var i = 10;
var array = [];
while (i--) {
array.push((function(i) {
// Сохранить i в замыкании
return function() {
return i + i;
}
})(i));
}
array.forEach(item => console.log(item())); // 18 16 14 12 10 8 6 4 2 0
// ------------------------------------------------------
// Или так
var i = 10;
var array = [];
while (i--) {
let value = i;
array.push(function() {
return value + value;
});
}
array.forEach(item => console.log(item())); // 18 16 14 12 10 8 6 4 2 0
let showEvent = new CustomEvent("show", {
detail: {
message: "Showing..."
}
});
document.addEventListener("show", event => alert(event.detail.message), false);
setTimeout(() => document.dispatchEvent(showEvent), 5000);