Хотя ES6 представил класс Ключевое слово, которое довольно хорошо имитирует классы и позволяет нам прыгать в объектно-ориентированное программирование, JavaScript не хватает возможности создавать публичные, частные и защищенные участники в классе.
Если вы работали с каким-либо объектно-ориентированным языком, вы должны знать важность внутреннего и внешнего интерфейса. Внутренний интерфейс относится к методам и свойствам класса, который доступен только самим классом, а не извне. Напротив, внешний интерфейс имеет методы и свойства, которые также доступны извне класса.
Три основных ключевых слова в игре являются публичными, защищенными и частными.
- Public: эти члены класса и доступны всем, кто может получить доступ к экземпляру класса (владельца).
- Частные: эти участники доступны только в классе, который создал создание объекта.
- Защищенное: это ключевое слово позволяет немного больше доступа, чем частных участников, но намного меньше, чем общественность. Защищенный участник доступен в классе (аналогично частному) и любой объект, который наследует от него. Защищенное значение разделяется на всех уровнях цепочки прототипа. Это не доступно никому другому.
Защищенное ключевое слово – самое сложное ключевое слово из трех, чтобы подражать JavaScript.
Публичный
Это природа по умолчанию JavaScript. Если что -то имеет доступ к объекту, у него есть доступ к своим членам. Пример:
const myObject = {
name: "Parwinder",
sayMyName: function () {
return this.name;
}
}
console.log(myObject.name); // Parwinder
console.log(myObject.sayMyName()); // Parwinder
В приведенном выше примере я могу получить доступ к свойству и методу без каких -либо проблем. Если бы вы предпочли это в классе синтаксиса:
class ObjectCreator {
name;
constructor(name) {
this.name = name;
}
sayMyName() {
return this.name;
}
}
const myObject = new ObjectCreator("Parwinder");
console.log(myObject.name); // Parwinder
console.log(myObject.sayMyName()); // Parwinder
Частный
Есть несколько способов создания личных переменных в JavaScript. Сначала закрытие.
function carMonitor() {
var speed = 0;
return {
accelerate: function () {
return speed++;
}
}
}
var car = new carMonitor();
var redCar = new carMonitor()
console.log(car.accelerate()); // 0
console.log(car.accelerate()); // 1
console.log(redCar.accelerate()); // 0
console.log(redCar.accelerate()); // 1
console.log(car.accelerate()); // 2
console.log(redCar.accelerate()); // 2
console.log(speed); // speed is not defined
автомобиль и Redcar поддерживать свой собственный частное скорость переменные и скорость не доступен снаружи. Мы заставляем потребителя использовать методы, определенные для функции или класса, а не доступ к свойствам напрямую (что они не должны). Вот как вы бы инкапсулировали свой код.
Второй путь – с помощью # обозначение.
class ObjectCreator {
#meaningOfLife;
constructor(name) {
this.#meaningOfLife = 42;
}
returnMeaningOfLife() {
return this.#meaningOfLife;
}
#returnAMessage() {
return "You will do great things in life";
}
}
const myObject = new ObjectCreator("Parwinder");
console.log(myObject.returnMeaningOfLife()); // 42
console.log(myObject["#meaningOfLife"]); // undefined
console.log(myObject.#meaningOfLife); // SyntaxError
console.log(myObject.#returnAMessage); // SyntaxError
Язык обеспечивает соблюдение инкапсуляции. Это синтаксическая ошибка, чтобы ссылаться на # имена из не сферы масштаба. Государственные и частные области не конфликтуют. Мы можем иметь как частные области #meaningoflife, так и общественные области значения в одном классе.
🚨 # Метод объявления частных членов класса находится в части ES2019/ES10.
Защищенный
Как я уже сказал в начале этого поста, защищенный – самый сложный из всех 3 для реализации в JavaScript. Единственный способ, которым я могу подумать об этом, – это использовать класс, который имеет добычу для свойства без сеттера. Свойство будет только для чтения, и любой объект будет наследовать его от класса, но оно будет изменено только из самого класса.
🙏 Если у вас есть пример создания охраняемых членов класса (или как можно ближе к защищению, как мы можем получить), пожалуйста, поделитесь!
class NameGenerator {
_name;
constructor(name) {
this._name = name;
}
get name() {
return this._name;
}
}
let nameGenerator = new NameGenerator("John");
console.log(`My name is ${nameGenerator.name}`); // My name is John
nameGenerator.name = "Jane"; // Cannot assign to 'name' because it is a read-only property.
Оригинал: “https://dev.to/bhagatparwinder/classes-in-js-public-private-and-protected-1lok”