定义`that = this`如何帮助我创建私有变量/成员?

时间:2010-12-15 09:54:14

标签: javascript object

我在javascript类中创建私有变量时正在阅读Douglas Crawford's piece

在其中他说你必须陈述that = this以“使对象可用于私人方法”。但是,我能够构建一个具有私有成员,私有方法和公共方法的示例,而无需定义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());

指定that = this的内容允许我执行此示例尚未执行的操作?

加了:

感谢@Gaby,所以我理解这一点:正如上面的示例所示,我可以在不使用that=this的情况下访问私有变量,但它确实让我可以访问 public 变量如下所示:

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());

2 个答案:

答案 0 :(得分:6)

  

通过惯例,我们创建一个 的私有   变量。这是用来制作的   对象可用于私有   方法即可。

     

这是一种解决方法   ECMAScript语言中的错误   导致这种情况的规范   内部功能设置不正确

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{}

住在http://www.jsfiddle.net/BpmQ3/1/

答案 1 :(得分:0)

不使用'那'你也可以实现这个:

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