Métodos e atributos privados no ES6 #293
Replies: 12 comments 2 replies
-
Utilizo factories. function object(param) {
let instance = {};
let privateProp = 1;
function privateFn() { /* ... */ }
instance.publicProp = privateProp + 1;
instance.publicFn = function publicFn() {
// ...
privateFn();
// ...
}
return instance;
} Mas isso é à la ES5 ainda né 😂 |
Beta Was this translation helpful? Give feedback.
-
Essa é uma das minhas maiores decepções com a nova implementação de Classes no ES6. Como assim eles não criaram uma forma simples de escrever métodos privados?!?! Inclusive, esse foi um dos motivos pelo qual eu decidi adotar o TypeScript em um projeto pessoal, porque dentre outras "vantagens sintáticas", ele te permite escrever algo como: class MinhaClasse {
// Declarando variáveis privadas
private minhaVariavel = 123;
// e funções privadas
private minhaFuncao() {
//...
}
} Mas não dá pra sair enfiando TypeScript em todo projeto que você usa, e as vezes ele nem casa com o escopo de um projeto e pode acabar conflitando com outras tecnologias. Ou seja, não resolve. Até onde eu sei, se não for usando táticas "das antigas" (ES5) como a do @danguilherme, ou alguma outra linguagem que compile pra JavaScript, como o TypeScript, não existe forma de declarar métodos e atributos privados usando a sintaxe do ES6. Existe uma proposta de incluir private fields no futuro, e o jeito é torcer para que ela seja implementada nas próximas versões da linguagem. |
Beta Was this translation helpful? Give feedback.
-
Em geral eu uso o underscore para delimitar os métodos e atributos privados faço algo como: class MyClass {
constructor(attr) {
this._attr = attr;
}
_private() {
// Some private method
}
public() {
// Some public method
}
} |
Beta Was this translation helpful? Give feedback.
-
@kazzkiq poiseh, tbm fiquei decepcionado com isso :/ |
Beta Was this translation helpful? Give feedback.
-
As classes do ES6 são só açúcar sintático para funções construtoras, por isso não suportam propriedades privadas. Uma classe como essa: class Person {
constructor (name, age) {
this.name = name
this.age = age
}
getAge () {
return this.age
}
} Apenas cria uma função construtora com o seguinte prototype: function Person (name, age) {
this.name = name
this.age = age
}
Person.prototype.getAge = function getAge () {
return this.age
} No final das contas, as classes do ES6 são só firulas desnecessárias que limitam a flexibilidade O JavaScript oferece alternativas melhores para trabalhar com objetos. |
Beta Was this translation helpful? Give feedback.
-
Não são firulas. Tudo começa de algum início.
O JS é uma linguagem à parte, não se trata apenas de criar algo e depois ver como funciona. O processo é inverso: se cria o padrão, revisa de forma precisa e depois traz isso às runtimes para implementarem. Classe em JS é algo novo, e no início com certeza é um syntax sugar para funções e protótipos, mas imagina o caos se não fosse? valores privados já estão a caminho, está sendo discutido e precisa entrar da forma certa. Olha essa lista pra ver tudo que está em discussão. Veja a complexidade que isso involve até gramática de lógica de sintaxe. Sabe o exemplo que você mencionou de TypeScript? O operador Veja só essa confusão acontecendo com public fields (similar aos private fields) onde o Babel (até o momento que estou escrevendo) tem um erro de execução: class Foo {
get x() { return 42; }
set x(y) {}
}
class Bar extends Foo {
x = 'Hello'
}
console.log(new Bar().x); // 42 O x sai 42 por que está rolando um class Foo {
get x() { return 42; }
set x(y) {}
}
class Bar extends Foo {
x: 'Hello'
}
console.log(new Bar().x); // 'Hello' O mesmo se aplica a private fields, você define uma propriedade privada que é definida quando o Agora imagina: conforme a linguagem é padronizada, não só escrita e vamos ver no que dá, é super importante definir quando esses valores são inicializados, quando são criados. Viu ali em cima que digo que é quando o Agora volto à sua pergunta:
Nada é simples, é necessario ser muito bem definido. Quer outra complexidade: retrocompatibilidade no JS não é só útil, é necessário. Quebrar algo pode significar quebrar a web, toda. Ou também serve dizer que os browsers simplesmente não vão implementar algo, pois eles não querem quebrar diante de meio bilhão de usuários e ver gente migrando para algo que "funcione melhor". Pensar bem e com calma - muita paciência - é melhor que arrependimentos futuros (tipo o 'use strict' ou |
Beta Was this translation helpful? Give feedback.
-
Particularmente não vejo segredo eu colocar métodos e atributos privados no Ecma6. Basta usar underscore para delimitar os métodos e atributos privados. As mudanças no sentido de trabalhar com objetos, que antes só era possível com algumas bibliotecas como Jquery ou algum malabarismo de programação, com Ecma6 ficou muito mais prático e simples de aplicar. |
Beta Was this translation helpful? Give feedback.
-
@DaviDuqueNascimento fazer isso não torna o método privado. Isso é nada mais nada menos que uma convenção de nomenclatura, adotada justamente pela limitação da linguagem. Métodos privados são inacessíveis fora de seu escopo, por definição. No fim, colocar underscore pra mascarar é só mais um dos "malabarismos" 🙂. |
Beta Was this translation helpful? Give feedback.
-
class IncreasingCounter {
#count = 0;
get value() {
console.log('Getting the current value!');
return this.#count;
}
increment() {
this.#count++;
}
} const counter = new IncreasingCounter();
counter.#count;
// → SyntaxError
counter.#count = 42;
// → SyntaxError
|
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
@fernandomoraes eu raramente preciso de acesso privado mas quando preciso uso da seguinte forma: function State (initial) {
let state = initial
return {
set (value) {
// ...
state = value
},
log () {
console.log(state)
}
}
} |
Beta Was this translation helpful? Give feedback.
-
fiz um teste usando Arrow function atribuída a uma variável: class MyClass {
this.n1 = 5;
this.n2 = 10;
#somar = () => this.n1 + this.n2;
calc() {
return this.#somar();
}
}
var my = new MyClass();
my.calc() // return 15;
my.#somar() // return private field |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Oi, Pelo oque eu vi na web, alguns simulam com WeakMap, outros com Symbols e outros através de convenção.
Gostaria de saber de vocês, como estão tratando em à isso.
Obrigado.
Beta Was this translation helpful? Give feedback.
All reactions