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