Pegue qualquer uma das soluções que seguem o padrão privado ou privilegiado de Crockford . Por exemplo:
function Foo(x) {
var y = 5;
var bar = function() {
return y * x;
};
this.public = function(z) {
return bar() + x * z;
};
}
Nos casos em que o invasor não tem direito de "execução" no contexto JS, ele não tem como acessar campos ou métodos "públicos" ou "privados". Caso o invasor tenha esse acesso, ele pode executar este procedimento:
eval("Foo = " + Foo.toString().replace(
/{/, "{ this.eval = function(code) { return eval(code); }; "
));
Observe que o código acima é genérico para toda a privacidade do tipo construtor. Falhará com algumas das soluções aqui, mas deve ficar claro que praticamente todas as soluções baseadas em fechamento podem ser quebradas dessa maneira com replace()parâmetros diferentes .
Após isso ser executado, qualquer objeto criado new Foo()terá um evalmétodo que pode ser chamado para retornar ou alterar valores ou métodos definidos no fechamento do construtor, por exemplo:
f = new Foo(99);
f.eval("x");
f.eval("y");
f.eval("x = 8");
O único problema que vejo com isso é que ele não funcionará nos casos em que há apenas uma instância e é criada no carregamento. Porém, não há razão para definir um protótipo e, nesse caso, o atacante pode simplesmente recriar o objeto em vez do construtor, desde que ele possua uma maneira de transmitir os mesmos parâmetros (por exemplo, eles são constantes ou calculados a partir dos valores disponíveis).
Na minha opinião, isso praticamente torna a solução de Crockford inútil. Como a "privacidade" é facilmente quebrada, as desvantagens de sua solução (legibilidade e manutenção reduzidas, desempenho reduzido, aumento de memória) tornam o método baseado em protótipo "sem privacidade" a melhor escolha.
Eu costumo usar sublinhados principais para marcar __privatee _protectedmétodos e campos (estilo Perl), mas a idéia de ter privacidade em JavaScript mostra apenas como é uma linguagem incompreendida.
Portanto, eu discordo de Crockford, exceto por sua primeira frase.
Então, como você obtém privacidade real em JS? Coloque tudo o que é necessário para ser privado no lado do servidor e use o JS para fazer chamadas AJAX.