js: доступ к области родительского класса - PullRequest
59 голосов
/ 24 февраля 2011

У меня есть класс jquery в обычном классе в JavaScript. Можно ли получить доступ к переменным в области родительского класса из функции обратного вызова в классе jquery?

Простой пример того, что я имею в виду, показан ниже

var simpleClass = function () {    
    this.status = "pending";
    this.target = jqueryObject;
    this.updateStatus = function() {
        this.target.fadeOut("fast",function () {
           this.status = "complete"; //this needs to update the parent class 
        });
    };
};

Теперь в приведенном выше примере функция обратного вызова пытается получить доступ к области объекта jquery. Есть ли способ получить доступ к переменной состояния в родительском классе?

Ответы [ 7 ]

96 голосов
/ 24 февраля 2011

Вы устанавливаете «this» для переменной в родительской функции, а затем используете ее во внутренней функции.

var simpleClass = function () {         
    this.status = "pending";     
    this.target = jqueryObject;     

    var parent = this;

    this.updateStatus = function() {         
            this.jqueryObject.fadeOut("fast",function () {            
                parent.status = "complete"; //this needs to update the parent class          
            });     
        }; 
    }; 
32 голосов
/ 12 марта 2015

Я отправлю этот ответ на этот старый вопрос в любом случае, так как никто еще не опубликовал это раньше.

Вы можете использовать метод bind в вызовах функций, чтобы определить область, к которой принадлежит this.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

Обычно каждый раз, когда вы создаете метод - this принадлежит текущей области действия функции. Переменные из scope2 не могут видеть переменные из scope1.

, например

function(){
    // scope 1
    this.baz = 'foo';

    function(){
        // scope 2
        this.baz // not defined
    };
};

с помощью метода bind вы можете определить область действия this внутри функции. Таким образом, используя .bind(this), вы сообщаете вызываемой функции, что их собственная область видимости из this относится к области родительской функции, например:

function(){
    // scope 1
    this.baz = 'foo';

    function(){
        // scope 1
        this.baz // foo
    }.bind(this);
};

поэтому в вашем случае это будет пример использования bind метода

var simpleClass = function () {    
    this.status = "pending";
    this.target = jqueryObject;
    this.updateStatus = function() {
        this.target.fadeOut("fast",function () {
           this.status = "complete"; //this needs to update the parent class 
        }.bind(this));
    }.bind(this);
};
5 голосов
/ 23 июля 2017

Используйте Функция стрелки

Функция стрелки не имеет своей собственной this.Используется значение this лексической области видимости;Функции стрелок следуют нормальным правилам поиска переменных.Таким образом, при поиске this, которого нет в текущей области видимости, они в конечном итоге находят this из его внешней области видимости.

Нормальный синтаксис функции

function(param1, param2) {}

Синтаксис функции стрелки

(param1, param2) => {}

Использование

const simpleClass = function () {    
    this.status = "pending";
    this.target = jqueryObject;
    this.updateStatus = function() { 
        this.target.fadeOut("fast", () => { // notice the syntax here
           this.status = "complete"; // no change required here
        });
    };
};

Использование функции Arrow в классе ECMAScript 2015

class simpleClass {

    constructor() {
        this.status = 'pending';
        this.target = jqueryObject;
    }

    updateStatus() {
        this.target.faceOut('fast', () => {
            this.status = "complete";
        });
    }
}

const s = new simpleClass();
s.updateStatus();

Описанный код работает только в современных браузерах .

2 голосов
/ 05 июня 2016

Установив "this" на переменную, вы можете легко получить к ней доступ.Нравится:

$("#ImageFile").change(function (e) {
    var image, file;
    var Parent=this;
    if ((file = Parent.files[0])) {
        var sFileExtension = file.name.split('.')[file.name.split('.').length - 1];

        if (sFileExtension === "jpg" || sFileExtension === "jpeg" || sFileExtension === "bmp" || sFileExtension === "png" || sFileExtension === "gif") {
            var reader = new FileReader();

            reader.onload = function (e) {
               alert(Parent.files[0].name);
            };
            reader.readAsDataURL(Parent.files[0]);
        }
        else { alert('Wrong file selected. Only jpg, jpeg, bmp, png and gif files are allowed.'); }
    }
})
2 голосов
/ 24 февраля 2011

Извините, м8. Вы должны поместить ссылку вниз в объекты следующим образом:

var simpleClass = function () {
    var _root = this;
    this.status = "pending";
    this.target = jqueryObject;
    this.updateStatus = function() {
        this.root = _root;
        _root.target.fadeOut("fast",function () {
           this.status = "complete"; //this needs to update the parent class 
        });
    };
};

обратите внимание на var _root

1 голос
/ 24 февраля 2011

попробуйте это:

   var sc = (function(scc){

    scc = {};

    scc.target = jQueryObject;


    scc.stt = "stt init";

    scc.updateStatus = function(){
        var elem = this;

        this.target.click(function(){
            elem.stt= "stt change";
            console.log(elem.stt);
        })

    }

    return scc;


}(sc || {}));

вы также можете определить целевой объект как личную переменную

0 голосов
/ 24 февраля 2011

Вы можете поддерживать состояние, используя переменные замыкания:

function simpleClass() {
   var _state = { status: "pending", target: jqueryObject; }

   this.updateStatus = function() {
      this.target.fadeOut("fast",function () {
         _state.status = "complete"; //this needs to update the parent class 
      });
   }
}

// Later...
var classInstance = new simpleClass();
...