2014-11-21 40 views
0

有沒有一種方法可以在Javascript中創建一個對象,使其所有方法都可用於構造函數?當創建一個Javascript「類」的實例時,是否有一種方法來構造對象,以便可以訪問所有方法?

我發現很難清楚說出我的問題..所以一個例子!

鑑於該類

function Example() { 
    var someVar = something; 
    var moreState = initializedToSomethingElse; 

    verifySomething(); <-- Fails! 

    this.verifySomething = function() { 
    // do verify stuff 
    } 
} 

我不能叫verifySomething在我的構造函數,因爲該方法,就實例而言,還不存在。所以,我得到一個未定義的錯誤。有沒有更好的方法來在JavaScript中創建對象,以便我可以避免這個問題?

+2

爲什麼不在定義它之後調用它? http://jsfiddle.net/th6kmsa4/ – Jamiec 2014-11-21 14:04:47

+0

老實說,可能有點愚蠢,但出於美學原因。我喜歡將所有初始化代碼一起阻塞在一個地方,而不是遍佈函數聲明。 – user3308774 2014-11-21 14:06:53

+0

從理論上講,我可能更喜歡使用冒號而不是句點('this :: verifySomething()')。這種語言不會那樣工作! – Jamiec 2014-11-21 14:10:21

回答

5

有沒有辦法在Javascript中創建一個對象,使得它的所有方法都可用於構造函數?

創建完畢後,您可以調用任何方法。在您的例子中,有兩個問題:

  1. 您還沒有創建的方法尚未

  2. 您錯誤地稱這是在JavaScript   —,使用構造內的對象限定詞(this.,通常)是不可選的,因爲它是在其他一些語言

如果你定義的構造函數的prototype屬性方法,只要這些任務HAP在構造函數調用之前(這通常是真的,並且有保證它的技巧),方法將在構造函數中的this上可用。如果您在內創建方法(如您的示例),只需先創建它們即可。

這裏的使用構造的prototype屬性的示例,其是指將通過new被用作創建的實例的原型對象:

function Example() { 
    var someVar = something; 
    var moreState = initializedToSomethingElse; 

    this.verifySomething(); // <== Works 
} 
Example.prototype.verifySomething = function() { 
    // do verify stuff 
}; 

var e = new Example(); 

這裏的定義,使得使用的構造內的示例事實上,功能聲明(而不是表達式)「懸掛」(在任何分步代碼運行之前完成)。

function Example() { 
    var someVar = something; 
    var moreState = initializedToSomethingElse; 
    this.verifySomething = verifySomething; // <== Note we assign first 

    this.verifySomething(); // <== Works 

    function verifySomething() { 
     // do verify stuff 
    } 
} 

var e = new Example(); 

如果你真的不喜歡叫它之前這樣做分配,你可以使用.call

function Example() { 
    var someVar = something; 
    var moreState = initializedToSomethingElse; 

    verifySomething.call(this); // <== Works 
    // this.verifySomething(); // <== Would not work 

    this.verifySomething = verifySomething; // <== Note we assign after 
    function verifySomething() { 
     // do verify stuff 
    } 
} 

var e = new Example(); 

我上面提到的,有技術低保prototype在構造函數被調用之前,構造函數的屬性已經完全充實。下面是他們中的一個(使用範圍界定功能):

var Example = (function() { 
    function Example() { 
     var someVar = something; 
     var moreState = initializedToSomethingElse; 

     this.verifySomething(); // <== Works 
    } 
    Example.prototype.verifySomething = function() { 
     // do verify stuff 
    }; 

    return Example; 
})(); 

var e = new Example(); 

上述規定,也沒有辦法代碼包含立即調用的作用域功能之外可以使用Example,直到之後的作用域功能已經完成,因此完全成立prototype屬性。

+1

夢幻般的答案!感謝所有的例子! – user3308774 2014-11-21 14:18:10

+1

@ user3308774:沒問題,很高興幫助。如果你喜歡用JavaScript的原型繼承來使用類類機制,或者只是想減少冗長,你可能會發現我的小幫手腳本:['Lineage'](http://code.google.com/p/) lineagejs /) – 2014-11-21 14:25:23

相關問題