¿De qué manera la definición de `that = this` me ayuda a crear variables / miembros privados?

Estaba leyendo el artículo de Douglas Crawford sobre la creación de variables privadas en las classs de JavaScript.

En él dice que tienes que decir that = this para "poner el object a disposition de los methods privados". Sin embargo, pude build un ejemplo que tiene miembros privados, methods privados y methods públicos sin definir that = this :

 function Form(id_code) { //private variable var id_code = id_code; var color = '#ccc'; //private method function build_style_attribute() { return 'style="background-color:'+color+'"'; } //public method this.render = function() { return '<div '+build_style_attribute()+'>'+id_code+'</div>'; } } var formModules = new Form('modules'); $('p#test').html(formModules.render()); 

¿Qué especificaría that = this me permite hacer lo que este ejemplo aún no hace?

Adicional:

Gracias @Gaby, así es como lo entiendo: como muestra el ejemplo anterior, tengo acceso a variables privadas sin usar that=this pero me da acceso a las variables públicas como se muestra aquí:

 function Form(id_code) { that = this; //private variable var id_code = id_code; var color = '#ccc'; //public variable this.weight = 'bold'; //private method function build_style_attribute() { //this will not work with either "weight" or "this.weight" return 'style="background-color:'+color+'; font-weight:'+that.weight+'"'; } //public method this.render = function() { return '<div '+build_style_attribute()+'>'+id_code+'</div>'; } } var formModules = new Form('modules'); $('p#test').html(formModules.render()); 

Por convención , hacemos una variable privada. Esto se usa para hacer que el object esté disponible para los methods privados .

Esta es una solución para un error en la especificación del lenguaje ECMAScript que hace que esto se configure incorrectamente para las funciones internas .

 function Test() { var that = this; function wrongprivate(){ return this; } function rightprivate(){ return that; } this.check= function (){ console.log( wrongprivate() ); console.log( rightprivate() ); } } var test= new Test(); test.check(); // will output // window // object{} 

En vivo en http://www.jsfiddle.net/BpmQ3/1/

Sin usar 'eso' también puedes lograr lo correcto. Esto:

 function someFunction(){ var that = this; function getThis(){ return this; }; function getThat(){ return that; }; return{ getThis:getThis, getThat:getThat } } var a = new someFunction(); alert(a.getThis()); // Object alert(a.getThat()); // Object