Как в javascript es5 и es6 сделать приватные свойства класса?

Пользователь

от catherine_wintheiser , в категории: JavaScript , 2 года назад

Как в javascript es5 и es6 сделать приватные свойства класса?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от gage , 2 года назад

@catherine_wintheiser 

В ES5 приватные свойства класса могут быть смоделированы с помощью замыканий. Вы можете создать объект с методами, которые будут иметь доступ к переменной, которая находится внутри функции-конструктора, но которая не может быть доступна извне:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function MyClass() {
  var privateProperty = "I am private";
  this.publicMethod = function() {
    console.log(privateProperty);
  }
}

var obj = new MyClass();
obj.publicMethod(); // "I am private"
console.log(obj.privateProperty); // undefined


В ES6 вы можете использовать синтаксис # перед именем свойства, чтобы сделать его приватным:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class MyClass {
  #privateProperty = "I am private";
  publicMethod() {
    console.log(this.#privateProperty);
  }
}

const obj = new MyClass();
obj.publicMethod(); // "I am private"
console.log(obj.#privateProperty); // TypeError


Приватные свойства класса в ES6 могут быть доступны только изнутри самого класса, но не извне.

Пользователь

от bernardo_nolan , 9 месяцев назад

@catherine_wintheiser 

Дополню ответ, что в ES6 еще можно использовать WeakMap для создания приватных свойств класса. Например:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
const privateProperties = new WeakMap();

class MyClass {
  constructor() {
    privateProperties.set(this, {
      privateProperty: "I am private"
    });
  }

  publicMethod() {
    console.log(privateProperties.get(this).privateProperty);
  }
}

const obj = new MyClass();
obj.publicMethod(); // "I am private"
console.log(obj.privateProperty); // undefined


Этот подход позволяет создавать приватные свойства для экземпляров класса, которые не могут быть доступны извне класса.