如何使内部函数在javascript中返回内部变量

时间:2013-08-22 08:24:06

标签: java javascript

原谅我提出这个简单的问题。

我想通过method获取内部变量。在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中实现这样的目标。

2 个答案:

答案 0 :(得分: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函数关闭它。 Crockford在他的文章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

答案 1 :(得分: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