2015-10-07 40 views
0

有了这个代码:成员函数不是一个函数错误

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

我得到这个错误: 类型错误:mything.majig不是一个函数

我已经做了JavaScript的一些时间,我已经完成了函数的一部分功能,并在之前调用它们。我知道它必须是我错过或遗忘的简单东西,但各种websearches(以及在这里戳)正在让我获得更深的理论答案,或者似乎表明这应该起作用的例子。

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

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

回答

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'); 
} 
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(); 
相关问题