原谅我提出这个简单的问题。
我想通过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中实现这样的目标。
答案 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