Skip to content

Instantly share code, notes, and snippets.

@disolovyov
Created September 6, 2011 20:04
Show Gist options
  • Select an option

  • Save disolovyov/1198792 to your computer and use it in GitHub Desktop.

Select an option

Save disolovyov/1198792 to your computer and use it in GitHub Desktop.
Объектно-ориентированное программирование. Практика 1.

Где взять V8 JavaScript

Мы в курсе используем среду Node.js. Скачивается она с официального сайта. Или можно скачать напрямую версию 0.5.5: node.exe.

Как писать и запускать программы

Исходный код программ на JavaScript записывается в файлы с расширением .js. После чего запустить программу можно с помощью node.exe из консоли (Command Prompt).

Предположим, что у нас есть файлы C:\Node\node.exe и C:\Node\program.js. Тогда программу можно запустить, написав в консоли:

C:
cd C:\Node
node.exe program.js
// Выводим строку на экран.
console.log('It Works!');
// Присваиваем функцию в переменную.
var p = console.log;
p('It Works!');
p(p);
// Создаём новый объект.
var obj = {
name: 'Anatoly',
surname: 'Ressin',
age: 31
};
// Выводим на экран поля объекта.
console.log(obj.name);
console.log(obj.age);
// Выводим объект целиком.
console.log(obj);
// Дополняем ранее созданный объект новыми полями.
obj.weight = true; // Потому что Анатолий — весомый человек. :)
obj.courses = ['OOP', 'FLP'];
console.log(obj);
for (var i = 0; i < obj.courses.length; i++) {
console.log(obj.courses[i]);
}
// Есть два способа создать функцию:
//
// 1. function f(x, y) { return x + y }
// 2. var f = function(x, y) { return x + y };
// Функция-фабрика:
// это специальная функция, создающая новые объекты.
var makeObj = function() {
// Описываем объект.
var obj = {
name: 'Anatoly',
age: 31
};
// И тут же возвращаем его как результат функции.
return obj;
}
// Используем фабрику для создания двух объектов.
var a1 = makeObj();
var a2 = makeObj();
// Изменяем только один объект.
a2.age++;
// На экране будет два разных объекта.
console.log(a1);
console.log(a2);
// Создаём с помощью фабрики один объект,
// а во второй просто присваиваем первый.
var b1 = makeObj();
var b2 = b1;
b2.age++;
// Но на экране будет два одинаковых объекта,
// потому что мы не создавали второй,
// а всего лишь «сослались» на первый,
// когда присваивали его в новую переменную.
console.log(b1);
console.log(b2);
// Функции можно различать по обладанию некоторым постоянным «состоянием»
// (отсутствие состояния будем называть «чистотой»):
//
// 1. Stateless (также: pure или «чистые»): такие функции,
// результат которых зависит *только* от их аргументов.
// Они не используют и не изменяют ничего, что доступно извне.
// 2. Stateful («грязные»): результат этих функций может зависеть
// от переменных вне тела функции. Они могут изменять эти переменные.
// Их также называют функциями с «побочными эффектами» (side effects).
// Создаём «грязную» функцию,
// которая использует и изменяет внутри себя внешнюю переменную *count*.
var count = 0;
var addOne = function() {
count++;
return count;
};
// На экране будут числа: 1, 2, 3.
console.log(addOne());
console.log(addOne());
console.log(addOne());
// Смысл, который мы закладывали в *addOne*: выдавать одно за другим числа,
// где каждое следующее больше предыдущего на 1.
// Но мы можем нарушить этот смысл, если вручную изменим переменную,
// которую внутри себя использует *addOne*.
// В этом заключается «грязность».
count = 100500;
console.log(addOne());
// Разместим «грязную» функцию *addOne* в «чистой» функции *makeAdder*.
// Так как переменная *count* доступна только внутри *makeAdder*,
// но не снаружи, то мы можем быть уверены, что её никто не изменит без спроса.
var makeAdder = function() {
var count = 0;
var addOne = function() {
count++;
return count;
};
return addOne;
};
// Таким образом, мы получаем фабрику функций,
// каждая из которых после создания имеет свою собственную переменную *count*.
var a1 = makeAdder();
var a2 = makeAdder();
// При выводе на экран вызовов созданных функций
// они будут увеличивать каждая свой счётчик: 1, 2, 3, 1, 2.
console.log(a1());
console.log(a1());
console.log(a1());
console.log(a2());
console.log(a2());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment