JavaScript клас и как да го използвате ефективно.
JavaScript класът е план за създаване на „обекти“. Класът капсулира данни и функции, които манипулират данни.
За разлика от други езици за програмиране като Java и C#, JavaScript класовете са синтактична захар над прототипното наследство. С други думи, ES6 класовете са само специални „функции“.
Преразгледани класове преди ES6
Преди ES6 JavaScript нямаше концепция за класове. За да имитирате клас, често използвате „модела конструктор/прототип“, както е показано в следния пример:
function Person(name) { this.name = name; } Person.prototype.getName = function () { return this.name; }; var john = new Person("John Doe"); console.log(john.getName());
Изход:
John Doe
Как работи.
Първо създайте Person
като функция конструктор, която има име на свойството, наречено name
. getName()
функцията е присвоена на prototype
, така че да може да се споделя от всички екземпляри от типа Person
.
След това създайте нов екземпляр от типа Person
, като използвате оператора new
. Следователно обектът john
е екземпляр на Person
и Object
чрез прототипно наследяване.
Следните изрази използват оператора instanceof
, за да проверят дали john
е екземпляр от типа Person
и Object
:
console.log(john instanceof Person); // true console.log(john instanceof Object); // true
ES6 клас декларация
ES6 въведе нов синтаксис за деклариране на клас, както е показано в този пример:
class Person { constructor(name) { this.name = name; } getName() { return this.name; } }
Този клас Person
се държи като типа Person
в предишния пример. Въпреки това, вместо да използва шаблон на конструктор/прототип, той използва ключовата дума class
.
В класа Person
constructor()
е мястото, където можете да инициализирате свойствата на екземпляр. JavaScript автоматично извиква метода constructor()
, когато инстанциирате обект от класа.
Следното създава нов Person
обект, който автоматично ще извика constructor()
на класа Person
:
let john = new Person("John Doe"); Code language: JavaScript (javascript)
getName()
се нарича метод от класа Person
. Подобно на функция конструктор, можете да извиквате методите на клас, като използвате следния синтаксис:
objectName.methodName(args) Code language: CSS (css)
Например:
let name = john.getName(); console.log(name); // "John Doe" Code language: JavaScript (javascript)
За да проверите факта, че класовете са специални функции, можете да използвате оператора typeof
, за да проверите типа на класа Person
.
console.log(typeof Person); // function Code language: JavaScript (javascript)
Връща function
както се очаква.
Обектът john
an също е екземпляр на типовете Person
и Object
:
console.log(john instanceof Person); // true console.log(john instanceof Object); // true
Клас срещу потребителски тип
Въпреки приликите между клас и потребителски тип, дефиниран чрез функция конструктор, има някои важни разлики.
Първо, декларациите на класове не се „повдигат“ като декларациите на функции.
Например, ако поставите следния код над секцията за декларация на клас Person
, ще получите ReferenceError
.
let john = new Person("John Doe"); Code language: JavaScript (javascript)
грешка:
Uncaught ReferenceError: Person is not defined Code language: JavaScript (javascript)
Второ, целият код в даден клас се изпълнява автоматично в строг режим. И не можете да промените това поведение.
Трето, методите на класа са „неизброими“. Ако използвате шаблон на конструктор/прототип, трябва да използвате метода Object.defineProperty()
, за да направите свойство неизброимо.
И накрая, извикването на конструктора на класа без оператора new
an ще доведе до грешка, както е показано в следващия пример.
let john = Person("John Doe"); Code language: JavaScript (javascript)
грешка:
Uncaught TypeError: Class constructor Person cannot be invoked without 'new' Code language: JavaScript (javascript)
Обърнете внимание, че е възможно да извикате функцията конструктор без оператора new
. В този случай функцията конструктор се държи като обикновена функция.
Резюме
- Използвайте ключовата дума JavaScript
class
, за да декларирате нов клас. - A
class
декларацията е синтактична захар над прототипното наследство с допълнителни подобрения.