1

请原谅我问了这个简单的问题。

我想通过方法获取内部变量。在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 中实现这样的事情。

4

2 回答 2

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 中,这将创建一个称为私有名称对象的东西。它不是字符串,但可以像访问属性一样使用。由于该属性没有名称,因此没有密钥就无法访问它。这使我们能够创建真正的私有属性

我在这篇文章中讨论了这种模式以及如何在 ES5 甚至 ES3 中非常接近它:ES6 中的私有属性——以及 ES3 和 ES5

上述两种模式都以不同的方式依赖闭包。如果您不熟悉它们,我关于它们的文章可能会很有用:闭包并不复杂

于 2013-08-22T08:26:30.993 回答
3

With pure javascript :

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

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

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

In that case words is a public property, so you can access it directly like so :

alert(myClass.words);

If you want to make it private as described around, note that :

  • getWords will not take part in class inheritance
  • it's a dirty choice in terms of memory usage since getWords is defined each time MyClass is instanciated
于 2013-08-22T08:29:55.393 回答