如何从$ .getJSON()调用访问自定义JS对象?

时间:2010-11-01 20:11:20

标签: javascript jquery

我有一个看起来像这样的JS对象。

function Product() {
    this.prop1 = 1;
    this.prop2 = 2;
}

function Work(values) {
    this.prodID = 0;
    this.anotherProp = 1;

    this.updateProductID = function(newProdID) {
        var sourceURL = "the URL here";
        alert("ID is: " + this.product.prodID); //displays 0
        $.getJSON(sourceURL, function(data) {

            //I want to update the property like this
            this.product.prodID = data.Products.ProductID;
        })
    };

我要做的是做一个json调用并填充Work对象实例的product.ProdID属性,但我总是得到this.product是未定义的。

2 个答案:

答案 0 :(得分:2)

由于您位于anonymous function范围内,因此您的上下文会发生变化。 cache您的上下文引用很常见,您可以通过闭包访问:

function Work(values) {
    var self = this;
    self.prodID = 0;
    self.anotherProp = 1;

    self.updateProductID = function(newProdID) {
        var sourceURL = "the URL here";
        alert("ID is: " + self.product.prodID); //displays 0
        $.getJSON(sourceURL, function(data) {

            //I want to update the property like this
            self.product.prodID = data.Products.ProductID;
        });
    };
}

另一种方式,可以通过jQuerys proxy方法$.proxy()上下文。

this.updateProductID = $.proxy(function(newProdID) {
    // this is now pointing to the "outer" this
}, this);

这是通过使用Javascripts .call() / .apply()方法完成的,该方法会覆盖被调用函数的this

答案 1 :(得分:0)

this更改了附件内部。您应该首先存储this

var upper_this = this;
this.updateProductID = function(newProdID) {
    var sourceURL = "the URL here";
    alert("ID is: " + this.product.prodID); //displays 0
    $.getJSON(sourceURL, function(data) {

        //I want to update the property like this
        upper_this.prodID = data.Products.ProductID;
    })
};