2009-07-12 55 views
1

我想將方法​​應用於涉及使用其私有變量的現有對象。目的是建立像這樣:將方法應用於javascript中的對象和私有變量

function a(given_id) 
{ 
    var id= given_id; 
} 

現在我想申請一些新的方法,它像這樣

my_obj = new a('some_id'); 
my_obj.myMethod = function(){ 
    alert(id); 
} 

,如果我現在去my_obj.myMethod()我得到一個錯誤說的ID是未定義。 如果我將id從private改爲public,這個代碼就可以工作。

我不明白爲什麼會發生這種情況,因爲如果myMethod最初是作爲特權方法定義的,那麼它將起作用。我能想到的唯一的事情就是myMethod被添加爲公共方法,而不是特權方法。

任何有關這方面的信息將不勝感激。

回答

2

使用this.id = ...而不是var id = ...(var會給你函數範圍aka局部變量)。

{編輯}嘗試:

function Foo(givenId) 
{ 
    var id = givenId; 

    this.Bar = function() { 
     WScript.Echo(id); //change this to alert(...) 
     } 
} 

var foo = new Foo(52); 
foo.Bar(); 

再次,VAR在一個函數有功能範圍(局部變量)。如果你想訪問它,把你的特權函數聲明爲外部函數的內部函數,並使用閉包來訪問它。

+0

是的我知道會解決它(如上所述),但我想保持ID變量私人。 var id應該可以從特權方法訪問,任何想法如何將它聲明爲特權,同時仍然將其應用於對象? – Ori 2009-07-12 06:31:42

+0

請參閱內聯編輯答案。 – 2009-07-12 07:03:09

0

我認爲你有誤解私有變量的想法。你試圖做的是訪問private var,因爲它受到保護,但JS對象中沒有受保護的變量。當你修改聲明之外的對象時,它將被視爲祖先。

3

我認爲你正在試圖建立一個「特權法」,基本上是一個方法,它能夠訪問私有變量:

function a(given_id) { 
    var id= given_id; 

    this.myMethod = function() 
    { 
     alert(id); 
    } 
} 

不能聲明構造外特權methos,因爲如果你這樣做所以,他們不會訪問構造函數的閉包。

推薦閱讀:

1

你想要什麼你不能這樣做,因爲有在JavaScript中沒有私有成員(本身)。在函數返回新對象之後,構造函數內部的var立即被丟棄。因此,以後無法訪問它。通過在構造函數中聲明一個成員函數(this.foo = function(){};),使其保持在某個閉包的唯一可能的方法是在閉包中捕獲它。您必須在構造函數中聲明此成員函數的原因是您需要嵌套作用域以創建閉包。通過將該函數聲明爲原型對象的成員或將其分配給已經創建的對象,您將失去嵌套的作用域,因此不會關閉並且無法訪問所謂的私有成員。