【问题标题】:Object Constructors and returns in JavascriptJavascript中的对象构造函数和返回
【发布时间】:2012-08-09 04:53:48
【问题描述】:
function makeHttpRequest(url, success) {
 $.ajax({
        url: url,
   dataType: "jsonp",
crossDomain: true,
   mimeType: 'application/javascript', 
      async: false,
    success: success
  });
} 

   var actions = {
       get_min_hit_list_bounty: function (user_id) {
          makeHttpRequest("get_min_hit_list_bounty?target_id=" + user_id + "&", function (data) {
             var data = data['body'],
                xml = convert(data);
             this.min_cost = $(xml).find('min_cost').text();

         this.cost = function () {
            return this.min_cost;
         }
      });
   }
};
var myBounty = new actions.get_min_hit_list_bounty(user);
alert(myBounty.cost());

我不能从这种类型的对象返回任何东西。我已经阅读了大量关于使用原型和使用“this”将其公开的内容,但我没有得到任何地方。有人可以解释为什么这不起作用吗?

TypeError: Object [object Object] 没有方法'cost'

【问题讨论】:

  • 你在makeHttpRequest()回调函数中定义函数,而不是在actions.get_min_hit_list_bounty对象中
  • 我在 } 之后尝试了 this.cost);但它出现未定义。
  • 使用该版本的代码更新您的问题
  • 动作中的功能比这里列出的要多。
  • 好吧,我已经解释了为什么你的问题中的代码不起作用。你现在想知道什么?

标签: javascript object constructor return


【解决方案1】:

这与对象构造函数无关。

最重要的是,您对异步调用的工作方式感到困惑(AJAX 中的第一个 A!)。 makeHttpRequest 中的匿名函数是使用请求的结果调用的 - 这可能是在其余代码执行之后的任何时间,或者根本不执行。

您需要使代码事件驱动 - 即您发出 AJAX 请求并在返回响应时运行代码

例如:

var onSuccess = function(data) {
    var data = data['body'],
    xml = convert(data);
    // ... etc
}

makeHttpRequest(url, onSuccess);

【讨论】:

  • 试过这种方式,但还是没有成功。
  • get_min_hit_list_bounty : function(user_id){makeHttpRequest("get_min_hit_list_bounty?target_id=" + user_id + "&", get_min_hit_list_bounty); var get_min_hit_list_bounty = function(data){ var data = data['body'],
  • 看来您在定义 get_min_hit_list_bounty 之前引用了它。
【解决方案2】:

我相信它应该是这样的:

var actions = {
       get_min_hit_list_bounty: function (user_id) {
            this.userId = user_id;
            this.min_cost = 999999;

            this.cost = function () {
                return this.min_cost;
            };

            this.getMinCost = function(callback) {
                var me = this;

                var queryString = [
                "get_min_hit_list_bounty?target_id=",
                this.userId,
                "&"].join("");

                makeHttpRequest(queryString, function (data) {
                    var data = data['body'],
                    xml = convert(data);
                    me.min_cost = $(xml).find('min_cost').text();
                    callback.apply(me);
                });
            }
        }
};

var myBounty = new actions.get_min_hit_list_bounty(user);

myBounty.getMinCost(function() {
    alert(this.cost());
});

您必须了解异步代码的工作原理。它不仅仅是一组依次执行的指令。从事件和回调的角度来考虑它。 谷歌应该提供帮助。

【讨论】:

  • 将警报更改为警报(myBounty.min_cost);现在它起作用了。谢谢:)
  • @StormyWeather this.cost() 或 myBounty.cost() 不能正常工作?
  • 没有一个。 Uncaught TypeError: Object [object Object] has no method 'cost'
  • @StormyWeather 检查您的代码。 this.cost() 对我有用。也许你复制了我以前版本的代码,我忘了添加“成本”函数。
  • 是的,你是对的。 this.cost() 现在可以工作了。也感谢您的时间和帮助。 :)
猜你喜欢
  • 2017-10-08
  • 2011-12-29
  • 1970-01-01
  • 2022-01-03
  • 2019-07-13
  • 1970-01-01
  • 2019-01-17
  • 2013-07-14
  • 1970-01-01
相关资源
最近更新 更多