2014-02-23 46 views
2

我有以下功能:作用域功能 - 使用Javascript

var Setup = function() { 
    var that = this; 
    this.x = 60; 

    Setup.prototype.Loop = function() { 
     console.log(this.x); // 1: returns 'undefined' 
     console.log(Setup.x); // 2: returns 'undefined' 
     console.log(hi.x); // 3: returns '60' 
     console.log(that.x); // 4: returns '60' 
    } 
} 

var hi = new Setup(); 

我想知道什麼是從Setup.prototype.Loop功能訪問this.x構造的正確方法是什麼?

我已經嘗試了四種方法(見上文):只有第三和第四行給我想要的結果。無可否認,行號3不是最好的方式,因爲它依賴於對象hi。線路號碼4似乎是我能想到的最好的事情。

我得到它的工作,但我正在努力學習最好的方式做事情。有沒有其他方式或更好的方式來做到這一點?

此外,我想這是一個問題,必須以前曾問過,但不知何故,我找不到單詞來找到問題。另外,如果我在這裏和那裏使用了一些錯誤的術語,請原諒我。

感謝您的回覆!

+1

4.方法是要走的路,通過使用嗨,你正在訪問槽實例,而不是父閉包(那)。 –

+1

應該沒有輸出,因爲你永遠不會調用'Loop'。一個問題是,Loop意味着被稱爲函數而不是構造函數,因此它不應該以大寫L開頭。另一個問題是您在構造函數體中設置了原型函數,這意味着您不知道在構造函數體中運行的共享原型對象和特定於實例的代碼之間的差異。也許下面的答案可以幫助你:http://stackoverflow.com/a/16063711/1641941原型不容易理解,所以請隨時問清楚什麼是不明確的。 – HMR

+0

@HMR - 我的確不太瞭解原型,你鏈接的帖子是SO上最好的書面答案之一。非常感謝你。 – AKG

回答

1

原型應該在構造函數的外部設置爲在創建新實例時可用。

var Setup = function() { 
    var that = this; 
    this.x = 60; 
} 

Setup.prototype.Loop = function() { 
    console.log(this.x); // 1: returns 'undefined' 
    console.log(Setup.x); // 2: returns 'undefined' 
    console.log(hi.x); // 3: returns '60' 
    console.log(that.x); // 4: returns '60' 
} 

var hi = new Setup(); 
+0

謝謝@dfsq - 但是,我發現它嵌套像我在其他人的演示代碼中做的那樣。無論如何,在構造函數之外設置原型和按照我的方式嵌套原型之間有什麼主要區別? – AKG

2

通常原型函數應的構造函數之外定義和this.x是訪問變量的正確方法。

var Setup = function() { 
    this.x = 60; 
}; 

Setup.prototype.Loop = function() { 
    console.log(this.x); 
}; 

(new Setup()).Loop(); // 60