Nano Hash - криптовалюты, майнинг, программирование

JavaScript — программирование на основе прототипов — this.myFunction не является ошибкой функции

Я создал экземпляр объекта JavaScript "Пользователь". Содержит все необходимое для управления пользователями. Здесь можно управлять даже загрузкой и возможной ошибкой AJAX. Ниже приведен снимок этого объекта.

var User = function(uid, ajaxURL) {
        this.uid = uid;
        this.ajaxURL = ajaxURL;
     };
     User.prototype = {
        loadingShow: function (tag) {
            this.tag = (tag) ? tag : '.tab-pane';
            $(this.tag + ' .loading').html('<img src="img/template/loading.gif" alt="Loading..." title="Loading...">').fadeIn('fast'); 
            },
            //...
    };
    User.prototype.loadAction = function (rel) {
        var utls = new User();
            var relAttr = rel;
        $.ajax({
            type: 'POST',
            url: this.ajaxURL + '&id=' + parseInt(this.uid),
            cache: true,
            dataType: 'json',
            data: {
                toDo: relAttr
            },
            beforeSend:function(){
                utls.loadingShow('#' + relAttr + '-tab');
            },
            //...

Он отлично работает, но у меня есть только вопрос, возможно, глупый, но я впервые сталкиваюсь с JavaScript OOP и программированием на основе прототипов.

Почему я должен создать var utls = new User(); для вызова этого utls.loadingShow(, а не просто вызвать его this.loadingShow(? Используя свойство this, я получаю сообщение об ошибке "TypeError: this.loadingShow не является функцией".


  • Не могли бы вы опубликовать остальную часть метода loadAction, особенно ту часть, которая идет после вызова $.ajax? 24.01.2014
  • Я отредактировал сообщение, как вы требовали :) Спасибо 24.01.2014
  • Вам не нужно создавать новый, вам просто нужно понять масштаб. Внутри функций ajax thisArg больше не указывает на объект User, а, скорее всего, на окно, jQuery ajax или что-то еще. вы можете использовать Function.bind или сохранить thisArg вне области действия функции ajax. или я полагаю, согласно ответу Cooke Monster, есть свойство контекста, которое вы можете использовать: P 24.01.2014
  • Большой. Я уже видел возможный дубликат, но я не понял, что мне нужно было поместить переменную utls = this; вне вызова AJAX. Большое спасибо! 24.01.2014
  • @RobertoRizzi более правильный ответ, поскольку вы используете jQuery.ajax, вероятно, использовали бы свойство «контекст» при создании вызова. 24.01.2014

Ответы:


1

"Почему я должен создавать var utls = new User(); для вызова этого utls.loadingShow(, а не просто вызывать его через this.loadingShow(?"

Потому что this в обратном вызове установлен на объект jqXHR.

Чтобы переопределить его, вы можете установить для свойства context: запроса $.ajax значение this, которое вы хотите.

$.ajax({
        type: 'POST',
        url: this.ajaxURL + '&id=' + parseInt(this.uid),
        cache: true,
        dataType: 'json',
        context: this, // <-- set the `this` value of the callbacks
        data: {
            toDo: relAttr
        },
        beforeSend:function(){
        //   v--- now it's correct
            this.loadingShow('#' + relAttr + '-tab');
        },
        success: function(data) {
            var art_tmp_str = '';

 // Why are you using this? ---v
 //           $(document).ajaxComplete(function(event, request, settings) {

             //   v--- now it's correct
                this.loadingHide('#' + relAttr + '-tab');
                $('#' + relAttr + '-tab').html(''); 
                if(data.success === true) {
                               //   v--- now it's correct
                    art_tmp_str = this.writeAction(relAttr, data);
                    $('#' + relAttr + '-tab').append(art_tmp_str);
                } else
                    $('#' + relAttr + '-tab').append('<p>' + data.error + '</p>');
//            });

Кроме того, не должно быть необходимости давать обработчик .ajaxComplete(), когда вы уже находитесь в обратном вызове success. Это следует сделать до того, как будут сделаны какие-либо запросы ajax, если вы действительно хотите, чтобы ко всем завершенным запросам применялось одно и то же поведение.

24.01.2014
  • Я не мог спросить ничего лучше! Большое спасибо!! :) 24.01.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..