class — это новая функция ES6, которую можно использовать для определения класса, по сути, class — это просто синтаксический сахар, это еще один способ написания конструктора. (Что такое синтаксический сахар? Это элегантное решение на уровне синтаксиса, позволяющее избежать ошибок кодирования и повысить эффективность кодирования. Короче говоря, портативный метод записи.)
class Person {
}
typeof Person // "function"
Person.prototype.constructor === Person // true
🚗 использовать
Использование такое же, как и при использовании конструктора, создание экземпляра объекта с помощью new
class Person {
}
let jon = new Person()
🚌 конструктор
Каждый класс должен иметь конструктор, если нет явного объявления, js движок автоматически добавит в него пустой конструктор:
class Person {
}
// 等同于
class Person {
constructor () {
}
}
🏎 свойства и методы
Свойства и методы, определенные в конструкторе, то есть определенные в this, принадлежат свойствам и методам экземпляра, в противном случае они принадлежат свойствам и методам прототипа.
class Person {
constructor (name) {
this.name = name
}
say () {
console.log('hello')
}
}
let jon = new Person()
jon.hasOwnProperty('name') // true
jon.hasOwnProperty('say') // false
🚓 Выражения свойств
let methodName = 'say'
class Person {
constructor (name) {
this.name = name
}
[methodName] () {
console.log('hello')
}
}
🚚 Статические методы
Метод, который можно вызвать непосредственно через класс без передачи объекта экземпляра, где this указывает на сам класс.
class Person {
static doSay () {
this.say()
}
static say () {
console.log('hello')
}
}
Person.doSay() // hello
Статические методы могут наследоваться подклассами
// ...
class Sub extends Person {
}
Sub.doSay() // hello
можно получить через суперобъект
// ...
class Sub extends Person {
static nice () {
return super.doSay()
}
}
Sub.nice() // hello
🚜 Строгий режим
Нет необходимости использовать use strict, потому что пока код написан внутри классов и модулей, можно использовать только строгий режим.
🏍 повысить
класс не имеет подъема переменных.
new Person() // Uncaught ReferenceError: Person is not defined
class Person {
}
🚄 свойство имени
Атрибут name возвращает имя класса, имя сразу после класса.
class Person {
}
Person.name // Person
🚈 это
По умолчанию экземпляр класса.
🚂 Геттер и сеттер
class Person {
get name () {
return 'getter'
}
set name(val) {
console.log('setter' + val)
}
}
let jon = new Person()
jon.name = 'jon' // setter jon
jon.name // getter
🛥 выражение класса
При необходимости определите внутреннее имя класса для класса, если нет, то его можно не указывать:
// 需要在类内部使用类名
const Person = class Obj {
getClassName () {
return Obj.name
}
}
// 不需要
const Person = class {}
Класс, который выполняется немедленно:
let jon = new class {
constructor(name) {
this.name = name
}
sayName() {
console.log(this.name)
}
}('jon')
jon.sayName() //jon