Как определение `that = this` поможет мне создать частные переменные / члены? - PullRequest
5 голосов
/ 15 декабря 2010

Я читал статью Дугласа Кроуфорда о создании закрытых переменных в классах javascript.

В ней он говорит, что вы должны указать 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, вот как я это понимаю: как показывает приведенный выше пример, у меня есть доступ к private переменные без использования that=this, но это дает мне доступ к общедоступным переменным, как показано здесь:

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 ]

6 голосов
/ 15 декабря 2010

По соглашению мы создаем приватную эту переменную.Это используется, чтобы сделать объект доступным для частных методов .

Это обходной путь для ошибки в спецификации языка 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{}

Live at http://www.jsfiddle.net/BpmQ3/1/

0 голосов
/ 19 июня 2015

Не используя «это», вы также можете достичь правильного:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...