2015-10-07 62 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(); 
相關問題