在jQuery中实现安全的解引用?

时间:2012-02-29 16:20:58

标签: javascript jquery dereference

我正在调查使用jQuery对象作为一个安全的de-referencer,就像他们在Groovy中一样。我试图解决的问题是我从AJAX调用中检索JSON,这些调用可能没有我想要的值。我想要一种方便的方法来检查在尝试使用该值进行某些操作之前是否获得了值。

对于非Groovy程序员,如果Groovy中的变量为null,则调用它的方法将以静默方式失败,而不是抛出空指针异常。

我可以使用jQuery运算符从空变量中创建一个空对象,如下所示:

var myvar
$(myvar).chainedfunc()

在此示例中,chainedfunc仍将在空对象上执行。

如果原始值为null,有没有办法阻止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 :(得分:0)

为什么要使用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 ""