成员函数不是函数错误

时间:2015-10-07 23:53:19

标签: javascript

使用此代码:

function thing(){
    function majig(){
        alert("done");
    }
}
var mything = new thing();
mything.majig();

我收到此错误: TypeError:mything.majig不是函数

我已经完成了一段时间的javascript,并且我已经将函数作为函数的一部分并且之前调用它们。我知道它必须是简单的我遗漏或遗忘,但各种网络搜索(并在这里探讨)让我得到更深层次的理论答案,或似乎表明这应该有效的例子。

我知道TypeError: foo 不是函数通常意味着语法错误。我查了一些示例,看起来就像我的语法正确一样(我尝试了一些变化而没有成功)。

这是一个愚蠢的简单错误,但我现在才抓住它。我的功能是如何使mything.majig();正常运行?

2 个答案:

答案 0 :(得分:3)

您已在thing中声明了一项功能,但它根本没有附加到this。试试这个:

function thing(){
    this.majig = function() {
        alert("done");
    }
}

var mything = new thing();
mything.majig();

可替换地:

function thing() {
  return {
    majig: function() {
      alert("done");
    }
  };
}

或者,更好的是:

function thing() { }
thing.prototype.majig = function () {
  alert('done');
}

答案 1 :(得分:2)

语法不是您认为的意思。它不是会员声明。它是一种内在的功能。内部函数就像局部变量一样工作 - 它们只能在外部函数的范围内访问:

function foo () {
    function bar () {}
    bar(); // accessible here
}
bar(); // undefined here

如果你的函数是构造函数,那么要将一个成员函数添加到它构造的对象中,你将它添加到构造函数的原型中:

function Foo () {}
Foo.prototype.bar = function () {}; // bar is a member of object Foo

var f = new Foo();
f.bar(); // call member function

javascript中的对象是动态的。它们的行为更像是其他语言中的地图/哈希。这意味着您可以直接将成员函数添加到对象而不是构造函数的原型:

var f = {};
f.bar = function () {};

f.bar(); // call member function

遵循上面的逻辑,由于构造函数中的this引用了正在构造的对象,因此您还可以动态地将函数添加到this。这通常被称为"装饰"因为它实际上是装饰器设计模式的特殊版本:

function Foo () {
    this.bar = function () {}
}

var f = new Foo();
f.bar();