2012-08-07 75 views
3

我試圖使用原型的功能添加到一個對象,我想我明白了整個概念訪問局部變量,所以這裏就是我所做的:創建所有原型功能

function ImgContainer() { 
    var current_image = 1; 
} 

ImgContainer.prototype = { 
    init: function() { 
     //initialize 
    }, 
    scrollLeft: function(){ 
     //scroll left 
    } 
} 

var imgContainer = new ImgContainer(); 

我想我可以在init和scrollLeft中訪問current_image,但是我得到未捕獲的ReferenceError:current_image沒有被定義。

我應該怎麼做一個在init和scrollLeft函數中都可訪問的變量?

+1

*您不能訪問*以'init'或'scrollLeft',因爲它不是在詞法範圍(即,既不'init'也不'scrollLeft'是變量在ImageContainer函數中)。當使用[[prototype]]時,我發現使用屬性(例如'this.current_image')更容易,而不是變量。 – 2012-08-07 22:39:33

回答

5

您將其添加爲實例化對象的屬性:

function ImgContainer() { 
    this.current_image = 1; 
} 

然後在功能訪問屬性:

ImgContainer.prototype = { 
    init: function() { 
     alert(this.current_image); 
    }, 
    scrollLeft: function(){ 
     //scroll left 
    } 
} 

您仍然可以使用短暫的內部方法來存儲的東西變量暫時去完成那個方法的工作。但是您將對象的狀態存儲在其屬性中。

+0

謝謝!還有一個問題,如果我在init內部有另一個函數,並且還必須訪問current_image,我應該怎麼做?我已經在init中使用局部變量來存儲current_image,但是我不能訪問它,因爲它再次超出範圍...... – shibbydoo 2012-08-07 23:05:34

+0

@shibbydoo你不應該在函數內部有函數,而只是方法。無論如何,init內部的函數也可以訪問屬性。 – Esailija 2012-08-08 07:40:58

1

您無法通過對象外的原型方法訪問對象的私有成員,因爲它們超出了範圍。你應該做的是這樣的:

function ImgContainer() { 
    var current_image = 1; 
    this.init = function() { 
     current_image = 'something_blahblah'; 
    } 
} 

var imgContainer = new ImgContainer(); 
+0

他們不是一個對象的成員,他們是正常的變量。 – Esailija 2012-08-07 22:43:14

+0

但我們可以將它們視爲私有成員,因爲只要對象存在,它們就可以使用。我稱他們爲私人^ _^ – sedran 2012-08-07 22:43:49

+3

嗯,但是變量和對象屬性之間有區別。對象屬性例如是''可刪除''。還有一大堆處理對象屬性的方法。有setters,getters,defineProperty等等 – Esailija 2012-08-07 22:44:50