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

Доступ к свойствам литерала объекта в методе jQuery

У меня есть следующий литерал объекта. В методе Init я установил обработчик для события щелчка. Позже, когда вызывается обработчик, я хочу получить доступ к свойству Bar с помощью ключевого слова this. В этот момент this имеет значение jQuery.

Кроме того, чтобы прояснить ситуацию, я не хочу реализовывать функции, встроенные в селекторы.

var StackOver = {

    Bar: "MyBarValue",

    Init: function(){
        $("#postId").click(this.Foo);
    },

    Foo: function(eventObject){
        // here **this** is jQuery keyword
        // how do I access StackOver.Bar?
    }
}

Как мне получить доступ к свойствам этого литерала объекта внутри Foo?

Это могло быть легко, если бы я использовал литерал конструктора, который мне не подходит:

var StackOver = function (){
    var self = this;

    function bar()
    {
        // I can use self here
    }
}

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

09.01.2014

  • Если вы не планируете переопределять его, вы можете просто ссылаться на него как на ... ну, StackOver.Bar. К моменту вызова функции это должно быть четко определено. 09.01.2014

Ответы:


1

один вариант:

Init: function(){
    $("#postId").click(this.Foo.bind(this));
}

другой вариант: (из http://api.jquery.com/jquery.proxy/)

Init: function(){
    $("#postId").click($.proxy(this.Foo, this));
}

оба из них принимают this переменную, поэтому вы не можете использовать this для других целей

если, однако, вы не можете использовать this:

Init: function(){
    $("#postId").click(function (self) {
        return function (event) {
            return self.Foo(self, event);
        }
    }(this));
}

а в Foo просто добавьте параметр self.

Foo: function (self, event...) {
  ...
}

С учетом всего сказанного, почему вы не можете использовать (function () {var self = this; ... }())? В конце концов, это обнаруживающий шаблон модуля

09.01.2014
  • он доступен как this. 09.01.2014
  • Извините, я, должно быть, неправильно понял. Внутри Foo уже есть jQuery this. Как мне получить доступ к каждому из них, используя то, что вы предлагаете? 09.01.2014
  • this будет подхвачен объектом StackOver, см. Мою правку, если это невозможно 09.01.2014

  • 2

    Все остальные предлагают .bind, что имеет смысл, но вы также можете просто сослаться на сам объект в закрытии:

    Foo: function(eventObject) {
        console.log(StackOver.Bar);
    }
    
    09.01.2014
  • хороший момент, если это синглтон, не нужно беспокоиться о this 09.01.2014
  • Я использую шаблон модуля выявления, о котором забыл упомянуть. Я редактировал вопрос. 09.01.2014

  • 3

    Я не уверен, почему это должен быть литерал объекта. Если вы можете использовать другие структуры, вы можете получить доступ через модуль раскрытия, подобный этому:

    var StackOver = (function() {
        var bar = "MyBarValue",
            init = function(){
                $("#postId").click(foo);
            },
            foo = function(eventObject) {
                // here `this` might be a jQuery wrapper object
                // but you can access `bar` directly.
            };
    
        return {
            Bar: bar, // Or not.  Do you really want this public?
            Init: init,
            Foo: foo
        }
    }())
    
    09.01.2014
  • Это мое личное предпочтение, основанное на моем исследовании. 09.01.2014
  • ошибка синтаксиса. _1 _ ‹- тут же. Больше не объектный литерал. 09.01.2014
  • Да, надо было проверить. Но, надеюсь, идея ясна. Код обновляется на всякий случай. 09.01.2014

  • 4
  • Там. Предупреждение: bind обработка обработчика - сложное дело, если вы Init более одного раза, с более чем одним объектом или с более чем одним элементом. Имейте в виду, что обработчик, на который ссылается сам элемент, теперь хранит ваш указатель this, а не объект StackOver или исходную функцию. Это все. 09.01.2014
  • Новые материалы

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

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

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

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

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

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

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