2013-08-22 158 views
1

請原諒我問這個簡單的問題。如何讓內部函數返回javascript中的內部變量

我想通過method.In得到內部變量。在Java中,我可以實現它作爲下面的代碼。

class MyClass{ 
    String words = "hello";  
    MyClass(){ 
     // constructor 
    } 
    String getWords(){ 
     return this.words; 
    } 
} 

然後,我可以通過調用方法getWords()得到的話(內變量)。

MyClass myClass = new MyClass(); // object instance 
System.out.println(myClass.getWords()); // get the words 

我的問題是,我怎麼能在JavaScript中實現這樣的事情。

+0

WT ,,,,,'getWords()'應'函數'not'string' – MaveRick

+1

@MaveRick給定的代碼是Java而不是JavaScript。 – Sirko

+0

阿哈對不起,那他爲什麼標記'javascript'? – MaveRick

回答

4

您的words實例成員是私有包。它不是公開的,但它也不是私人的;同一包中的任何其他類都可以訪問它。在JavaScript中實現這很困難。

如果你希望它是私有的,對於JavaScript中的經典模式如下:

function MyClass() { 
    var words = "hello"; 
    this.getWords = function() { 
     return words; 
    }; 
} 

var instance = new MyClass(); 
console.log(instance.getWords()); 

注意通過new MyClass創建的每個對象將獲得自己的getWords功能的副本。 words只是構造函數中的一個變量; getWords函數關閉它。克羅克福德在他的文章Private Members in JavaScript中對此進行了討論。對於更接近私人包的東西,或者只是爲了避免爲每個實例重新創建該功能,您都希望針對ES6   —計劃的模式可以非常接近ES5(甚至ES3)實現的模式:

var MyClass; 
var AnotherPackageClass; 
(function() { 
    // Everything within this scoping function is the "package" 

    var wordsKey = new Name(); // ES6, but see article below for an ES3/ES5 option 

    MyClass = function() { 
     this[wordsKey] = "hello"; 
    }; 
    MyClass.prototype.getWords = function() { 
     return this[wordsKey]; 
    }; 

    AnotherPackageClass = function() { 
    }; 
    AnotherPackageClass.prototype.getWordsFrom(o) { 
     return p[wordsKey]; 
    }; 
))(); 

請注意撥打new Name。在ES6中,這將創建一個名爲private name object的東西。它不是一個字符串,但它可以像訪問屬性一樣使用。由於該屬性沒有名稱,因此無法在沒有密鑰的情況下訪問它。這使我們能夠創建真正私人的屬性

我討論這個模式,你怎麼能在這篇文章中變得非常接近它在ES5   —甚至ES3   —:以上Private Properties in ES6 -- and ES3, and ES5

兩個模式都依賴於封閉,以不同的方式。我對他們的文章可能是如果他們不熟悉對你有用:Closures are not complicated

3

使用純JavaScript:

var MyClass = function() { 
    this.words = 'hello'; 
}; 

MyClass.prototype.getWords = function() { 
    return this.words; 
}; 

var myClass = new MyClass(); 
alert(myClass.getWords()); 

在這種情況下words是公共財產,所以你可以像這樣直接訪問:

alert(myClass.words); 

如果你想使它私人圍繞描述,注意:

  • getWords不會參與類繼承
  • 它自getWords在存儲器使用方面髒選擇每次MyClass定義被實例化
相關問題