2010-08-22 32 views
17

我想從一個對象內調用函數MyMethod,但是下面的語法都不起作用。 下面必須有一個非常明顯的錯誤,但我看不到它。Javascript - 如何在該類內的類中調用函數?

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 

    <script type="text/jscript"> 

    function MyObject() { 

     //how do I get one of these to work?? 
     this.MyMethod; //does not work 
     this.MyMethod(); //does not work either 
     MyMethod(); //does not work either 

     this.MyMethod = function() { 
     alert('It works'); 
     } 
    } 

    var test = new MyObject(); 

    </script> 

</head> 
<body> 

</body> 
</html> 
+1

你可以移動這部分代碼 「this.MyMethod =函數(){ 警報( '它的工作原理');」 上面的方法調用到MyMethod?並看看這是否有所作爲? – InSane 2010-08-22 11:48:18

回答

21

主要有兩個問題

  1. MIME類型爲text/javascript,不text/jscript
  2. 您後定義方法您嘗試調用它

所以:

function MyObject() { 
    this.MyMethod = function() { 
     alert('It works'); 
    } 
    this.MyMethod(); //should now work 
    } 

    var test = new MyObject(); 
+0

http://ejohn.org/apps/learn/#6 – sova 2010-11-08 22:48:00

2

您已將該調用放到javascript類的構造函數中的私有方法。 在這一點上,功能尚未初始化

,但如果你像初始化對象這樣:

var test = new MyObject(); 

,然後做到這一點:

test.myMethod(); 

它會奏效。

-2

我很確定你可以在文件中的任何位置定義方法,即使在你調用它們之後,但他們定義方法的方式就是缺陷。

http://ejohn.org/apps/learn/#5

請注意,如果你定義一個變量與一個匿名函數,因爲它的價值,那麼你不能調用由名稱的功能(因爲它沒有一個)。相反,你應該使用約定

function nameOfTheFunction(arguments) { 
... 
} 

我發現下面的鏈接將是非常有用的命名:

http://www.dustindiaz.com/javascript-function-declaration-ambiguity/

+1

這個缺陷並不是方法定義的方式,缺點是方法被定義時。 – 2013-03-22 20:07:39

0
var MyObject = function MyObject() { 
     this.MyMethod = function() { 
     alert('It works'); 
     } } 

var test = new MyObject(); test.MyMethod(); 

以上就行了。或者你可以創建一個構造函數並在其中調用該方法。因此,在創建對象時,它會調用this.MyMethod()

1

2種方式定義一個函數提供不同的通達性

首先,設置它的父函數的性質,如在完成「下面的腳本的一個版本。如果你這樣做,該功能僅在之後可用給出定義。其次,用「功能函數名稱(){...}」的經典方法定義函數。該定義經歷了「提升」,這意味着該功能在整個父對象中變得可用,即,甚至在其被定義的位置之上。根據原始海報的代碼,您可以在下面的示例中的「B」版本中看到它。同樣在https://jsfiddle.net/dnL4j30u/

<script> 
    function MyObject() { 

    MyMethod(); 

    this.MyMethod = function() { 
     console.log('It works A'); 
    } 

    this.MyMethod(); 

    MyMethod(); 

    function MyMethod() { 
     console.log('It works B'); 
    } 

    } 
    var test = new MyObject(); 
</script> 

輸出是

It works B  (this works because the second definition gets hoisted) 
It works A 
It works B 
相關問題