Javascript中的子函数

时间:2015-10-28 12:52:49

标签: javascript

需要在JS中编写代码的建议。这是我的代码:

function Book(name) {
    this.name = name;
    // Some vars need to be downloaded
    $.ajax({
        method: "POST",
        url: "http://localhost/books.php"
    }).done(function( res ) {
        this.price = this.analyze(res); // <--WRONG
        return this;
    });
}

Book.prototype.analyze = function(res){
    var output = 50 * res;
    // do something
    return output;
}

检查标记的行。什么是实现我在那里尝试的最佳方式?

2 个答案:

答案 0 :(得分:2)

对于$ .ajax(),有一个参数'context'。你可以使用它。所以你的代码将是

function Book(name) {
    this.name = name;
    // Some vars need to be downloaded
    $.ajax({
        context: this,
        method: "POST",
        url: "http://localhost/books.php"
    }).done(function( res ) {
        this.price = this.analyze(res); // <-- not wrong any more
        return this;
    });
}

代码中的问题是函数中的'this'不是指外层类。您可以通过两种方式更改代码。

1)您可以将对象的外部上下文分配给某个变量并在函数中使用它。即。

function Book(name) {
    var self = this;
    this.name = name;
    // Some vars need to be downloaded
    $.ajax({
        method: "POST",
        url: "http://localhost/books.php"
    }).done(function( res ) {
        self.price = self.analyze(); // <--not wrong any more
        return self;
    });
}

2)另一个选择是让你的函数在适当的上下文中运行,例如$ .proxy()

function Book(name) {
    var self = this;
    this.name = name;
    // Some vars need to be downloaded
    $.ajax({
        method: "POST",
        url: "http://localhost/books.php"
    }).done($.proxy(function( res ) {
        this.price = this.analyze(); // <--not wrong any more
        return this;
    }, self));
}

答案 1 :(得分:1)

$.ajax行之前,添加var that=this;。然后将<--WRONG行更改为return that.getPrice();