【问题标题】:Object function is not a function对象函数不是函数
【发布时间】:2012-02-06 07:32:18
【问题描述】:
var plugin = {
    Init: function() {
        this.UpdateUI();
        if (this.Status() == 1) {
            ...
        } else {
            ...
        }
    },
    Status: function() {
        ...
    },
    UpdateUI: function() {
        ...
    }
}

这是基本代码。问题是,在调用Init时,出现如下错误:

this.UpdateUI is not a function
this.Status is not a function

谁能告诉我我的代码有什么问题?

【问题讨论】:

  • 能贴出调用Init()的代码吗?
  • 范围问题,this 不是指插件,而是指初始化函数。如果您将 Status 和 UpdateUI 函数放在 init 函数中,那么您的代码将正常工作。我认为 bardiir 为您提供了正确的解决方案。
  • 我认为我们刚刚发现了 javascript 的丑陋一面,根据对我的回答的投票,似乎对此有一些不同的观点:D
  • @CoryDanielson:我们不知道this 指的是什么,因为我们不知道Init 是如何被调用的。但这不是范围问题,仅仅将函数放在 Init 函数中是行不通的。

标签: javascript oop function object


【解决方案1】:

这是因为 this 内部的 plugin.Init 指的是 plugin.Init 而不是 plugin 本身。改成这样:

var plugin = {
    Init: function() {
        plugin.UpdateUI();
        if (plugin.Status() == 1) {
            ...
        } else {
            ...
        }
    },
    Status: function() {
        ...
    },
    UpdateUI: function() {
        ...
    }
}

原型:

function Plugin(){
  var self = this;

  this.Init = function() {
    self.UpdateUI();
    if (self.Status() == 1) {
      ...
    } else {
      ...
    }
  };
}

Plugin.prototype.status = function() {
            ...
  };
Plugin.prototype.UpdateUI: function() {
    ...
  }

var plugin = new Plugin();

【讨论】:

  • 为什么this 不会渗透到函数体内?你确定这是可能的吗?
  • 对,这样的代码无效。您需要将self 替换为plugin
  • 对不起。我以为我看到了原型声明。事实上,在对象文字中你不能这样做。我修改了代码以直接引用plugin,尽管我认为更好的方法是声明一个实际的类/原型。
  • -1,对不起。前提是错误的,“修复”会破坏 OOP(因为这些方法将始终引用 plugin,即使它们被复制到不同的对象)。
  • 其实等一下。 . .我收回我的说法,即您显然熟悉原型:您标记为“原型”的示例实际上根本不使用原型,而是使用构造函数。
【解决方案2】:

在调用 init 的上下文中,这可能是别的东西。

尝试改用plugin.UpdateUIplugin.Status,它们总是引用正确的函数。

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 2015-08-11
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多