Достижение безопасного разыменования в jQuery? - PullRequest
1 голос
/ 29 февраля 2012

Я исследую использование объекта jQuery в качестве безопасного де-реферратора, как в Groovy. Проблема, которую я пытаюсь решить, заключается в том, что я получаю JSON из вызовов AJAX, которые могут не иметь значений, которые я ищу. Мне бы хотелось, чтобы удобный метод проверял, получаю ли я значение обратно, прежде чем пытаться что-то сделать с этим значением.

Для программистов, не являющихся Groovy, если переменная в Groovy имеет значение null, вызывающие ее методы завершаются с ошибкой, а не генерируют исключения нулевого указателя.

Я могу создать пустой объект из пустой переменной, используя оператор jQuery, например:

var myvar
$(myvar).chainedfunc()

В этом примере chainedfunc будет по-прежнему выполняться для пустого объекта.

Есть ли способ предотвратить выполнение chainedfunc, если исходное значение было нулевым?

Я понимаю, что мне, возможно, придется жить с выполнением связанных функций на пустом объекте.

Примечание:

Я оставляю мысль ниже для записи, но я понимаю, что логика неверна. В случае 1 объект имеет значение null, в этом случае нет типа, поэтому нет способа создать новый объект того же типа, в случае 2 объект существует, и в этом случае я возвращаю объект без изменений. Общий вопрос все еще имеет смысл, хотя.

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

$.fn.safe = function(){
    if (this.get(0)){
        return this.get(0)
    }
    else return []
}

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

// this does not work because type is not a constructor
$.fn.safe = function(){
    var type = typeof this.get(0)
    return this.get(0) || new type()
}

1 Ответ

0 голосов
/ 29 февраля 2012

Зачем использовать для этого jQuery? Вы можете либо просто создать свой собственный набор функций, которые работают с вашими данными, которые все проверяют целостность данных, прежде чем что-либо делать с ними, или вы можете создать свой собственный объект с методами, где методы проверяют данные. Это все, что делает jQuery.

Обычные функции:

function func1(data, arg) {
    if (!data) return;
    // carry out func1 on data here
}

function func2(data, arg) {
    if (!data) return;
    // carry out func2 on data here
}

Или как объект:

function dWrap(data) {
    this.data = data;
}

dWrap.protototype = {
    func1: function(arg) {
        if (!this.data) return(this);
        // do func1 operation here
        return(this);
    }

    func2: function(arg) {
        if (!this.data) return(this);
        // do func2 operation here
        return(this);
    }
    toString: function() {
        if (!this.data) {
            return("");
        }
        return(this.data.toString());
    }
};

var myData = 45;
var x = new dWrap(myData);
x.func1(3).func2("foo");
x.toString();                     // returns "45"

var y = new dWrap(null);
y.func1(3).func2("foo").toString();   // returns ""
...