/*class Foo {
#privateField = 'test';
constructor(bar)
{
this.bar = bar;
}
static someStaticMethod()
{
return 3;
}
someMethod()
{
return this.bar + 5;
}
#noStaticPrivateMethod()
{
return this.#privateField+' hello world';
}
noStaticOpenMethod()
{
return this.#noStaticPrivateMethod();
}
}*/
function Foo(bar)
{
privateField = 'test';
this.bar = bar;
this.noStaticPrivateMethod = function()
{
return privateField+' hello world';
};
}
Foo.someStaticMethod = function someStaticMethod()
{
return 3;
};
Foo.prototype.someMethod = function someMethod()
{
return this.bar + 5;
};
Foo.prototype.noStaticOpenMethod = function noStaticOpenMethod()
{
return this.noStaticPrivateMethod();
};
console.log('До инициализации класса');
console.log('Тест открытых методов');
console.log(Foo.someStaticMethod); //someStaticMethod() { return 3; }
console.log(Foo.someStaticMethod()); //3
console.log(Foo.prototype.someMethod); //someMethod() { return this.bar + 5; }
console.log(Foo.prototype.someMethod()); //NaN
console.log('Тест приватных методов');
console.log(Foo.prototype.noStaticOpenMethod); //noStaticOpenMethod() { return this.#noStaticPrivateMethod(); }
console.log(Foo.prototype.noStaticPrivateMethod); //undefined
const instance = new Foo(5); //Создаю экземпляр класса
console.log('После инициализации класса');
console.log('Тест открытых методов');
console.log(instance.someStaticMethod); //undefined
console.log(instance.someMethod()); //10
console.log('Тест приватных методов');
console.log(instance.noStaticOpenMethod()); //test hello world
console.log(Foo.prototype.noStaticOpenMethod); //noStaticOpenMethod() { return this.#noStaticPrivateMethod(); }
console.log(Foo.prototype.noStaticPrivateMethod); //undefined
Что класс, что его нативная реализация будут давать идентичный результат. Но вот как сделать метод и Статичным и Приватным на прототипах, вот тут и вопрос.
JavaScript
Можно ли на Прототипах сделать "Статический приватный метод"?
Вот наглядный пример, как можно перевести Классы(ES6) на Прототипы(ES5):
В ES5 и прототипной системе JavaScript, прямого аналога статическим приватным методам из современных классов (ES6) нет. Однако, можно имитировать такое поведение, используя концепции области видимости и замыканий.
Давайте попробуем создать статический приватный метод для вашего примера на основе прототипов.
1. Определите функцию (которая представляет собой ваш "класс") и внутри этой функции определите ваш статический приватный метод.
2. Этот "статический приватный метод" будет доступен только внутри этой функции (благодаря области видимости и замыканиям), но не будет доступен снаружи.
Вот пример, как это может выглядеть:
```javascript
(function() {
// Статический приватный метод
function staticPrivateMethod() {
return "I'm static and private!";
}
function Foo(bar) {
this.bar = bar;
// Открытый метод, который использует статический приватный метод
this.useStaticPrivate = function() {
return staticPrivateMethod();
};
}
// Добавляем публичные методы через прототип
Foo.prototype.someMethod = function() {
return this.bar + 5;
};
// Создаем экземпляр
const instance = new Foo(5);
console.log(instance.useStaticPrivate()); // "I'm static and private!"
console.log(staticPrivateMethod); // Ошибка: staticPrivateMethod не определено
})();
```
Обратите внимание, что вы не можете получить доступ к `staticPrivateMethod` снаружи функции, в которой он был определен, что делает его "приватным". И поскольку он не является частью прототипа или экземпляра, он также является "статическим".
Давайте попробуем создать статический приватный метод для вашего примера на основе прототипов.
1. Определите функцию (которая представляет собой ваш "класс") и внутри этой функции определите ваш статический приватный метод.
2. Этот "статический приватный метод" будет доступен только внутри этой функции (благодаря области видимости и замыканиям), но не будет доступен снаружи.
Вот пример, как это может выглядеть:
```javascript
(function() {
// Статический приватный метод
function staticPrivateMethod() {
return "I'm static and private!";
}
function Foo(bar) {
this.bar = bar;
// Открытый метод, который использует статический приватный метод
this.useStaticPrivate = function() {
return staticPrivateMethod();
};
}
// Добавляем публичные методы через прототип
Foo.prototype.someMethod = function() {
return this.bar + 5;
};
// Создаем экземпляр
const instance = new Foo(5);
console.log(instance.useStaticPrivate()); // "I'm static and private!"
console.log(staticPrivateMethod); // Ошибка: staticPrivateMethod не определено
})();
```
Обратите внимание, что вы не можете получить доступ к `staticPrivateMethod` снаружи функции, в которой он был определен, что делает его "приватным". И поскольку он не является частью прототипа или экземпляра, он также является "статическим".
Алексей Фатский
Я сделал тесты, всё получилось. Дополнение к моему основному примеру будет выглядеть так:
Я могу ошибаться, но насколько я помню в ES5 и прототипной системе нет встроенного способа создать статический приватный метод. Однако ты можешь сэмулировать это, используя замыкания и локальные переменные
Похожие вопросы
- Зачем разработчики js сделали так что там где могли быть функции они добавили методы встроенных объектов.
- Что такое статические файлы
- Разъясните что есть что в данных методах
- Почему jQuery методы популярнее js методов при общении с ДоМ?
- Метод slice не сработал
- Вопрос про контекст "this"
- Что значит "чистый Javascript"?
- У javascript есть аналог этих функций и методов, как в python?
- Javascript Объясните, пожалуйста, методы apply, call и caller.
- Почему меняется индекс при работе метода reduce?