Введение
Несмотря на то, что в JavaScript нет классов, этот язык представляет концепции объектно-ориентированного программирования.
JavaScript содержит функции первого класса, это означает, что мы можем расценивать функции как объекты, то есть мы получаем возможность возвращать или передавать их в другие функции. Это позволяет нам создавать классоподобную семантику в функциях. В этой статье мы сосредоточимся на таких особенностях JavaScript:
- Объекты класса;
- Конструктор;
- Закрытые члены;
- Открытые/ общедоступные члены;
- Статические члены;
- Наследование.
В этой статье термины «класс» и «функция» взаимозаменяются. Хотя это различные понятия, они используются аналогично в контексте данной статьи.
Объекты класса
var Person = function () { };
var person1 = new Person();
var person2 = new Person();
console.log(person1 instanceof Person); // true
console.log(person2 instanceof Person); // true
Представьте себе класс Person,созданный с помощью выражения функции. Мы можем добавлять объекты этого класса, используя ключевое слово new.Каждый объект занимает отдельное место в памяти, но имеет тип Person.
Конструктор
var Person = function (firstName) {
this.firstName = firstName;
console.log('Instance created');
};
var person1 = new Person("Foo"); // logs "Instance created"
var person2 = new Person("Bar"); // logs "Instance created"
console.log('person1 is ' + person1.firstName); // logs "Foo"
console.log('person2 is ' + person2.firstName); // logs "Bar"
Определение функции действуют как конструктор класса Person. Аргумент функции – это параметр, переданный конструктору при создании объекта. Используя ключевое слово this, мы можем инициализировать атрибуты класса, например firstName.
Закрытые члены
var Person = function (firstName) {
var firstName = firstName;
};
var person1 = new Person("Foo");
var person2 = new Person("Bar");
person1.firstName; // undefined
person1.firstName; // undefined
Область видимости firstName, находясь внутри функции Person, ограничена. Идеальный способ доступа и управление закрытыми членами класса реализуется с помощью функции accessor, похожей на setter() и getter() в Java.
var Person = function (firstName) {
var firstName;
};
Person.prototype.setFirstName = function (firstName) {
this.firstName = firstName;
}
Person.prototype.getFirstName = function () {
return this.firstName;
}
var person1 = new Person();
var person2 = new Person();
person1.setFirstName('Foo');
person2.setFirstName('Bar');
person1.getFirstName(); // Foo
person2.getFirstName(); // Bar
Видео курсы по схожей тематике:
Публичные члены
var Person = function (firstName) {
this.firstName = firstName;
};
Person.prototype.sayHello = function () {
console.log(this.firstName + ' says Hello!');
}
var person1 = new Person("Foo");
var person2 = new Person("Bar");
person1.sayHello(); // logs "Foo says Hello!"
person2.sayHello(); // logs "Bar says Hello!"
firstName и sayHello – публичные члены класса Person. Они доступны и могут быть использованы вне определения функции.
Статические члены
var Person = function () { }
Person.firstName = "First Name";
var person1 = new Person();
console.log(person1.firstName); //logs undefined
console.log(Person.firstName); //logs "First Name"
Статические члены класса доступны с className, на них невозможно воздействовать объектами класса.
Наследование
var Person = function (firstName) {
this.firstName = firstName;
};
Person.prototype.sayHello = function () {
console.log("Hello, I'm " + this.firstName);
};
var Student = function (firstName, subject) {
Person.call(this, firstName);
this.subject = subject;
};
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
var student1 = new Student('Foo', 'Math');
student1.sayHello(); // "Hello, I'm Foo"
console.log(student1 instanceof Person); // true
console.log(student1 instanceof Student); // true
Бесплатные вебинары по схожей тематике:
Student – дочерний класс класса Parent, он автоматически наследует все члены родительского класса. Мы делаем определенный вызов конструктору родительского класса, используя Person.call и убеждаемся, что прототип наследуется от Person. Этот тип наследования называется прототипным.
Использование данных элементов в модуле JavaScript улучшит Ваш код и сделает его модульным.
Источник : http://pankajparashar.com/posts/javascript-classes/
Статьи по схожей тематике