当我尝试使用私有方法进行面向对象的纯JS时,我经常执行以下操作
(function(exports) {
var Foo = function(num) {
this.num = num
};
var addTwo = function() {
this.num += 2;
};
Foo.prototype.addFour = function() {
addTwo.call(this);
addTwo.call(this);
};
exports.Foo = Foo;
})(this);
然后我可以做
var foo = new Foo(0);
foo.addFour();
console.log(foo.num); // => 4
感觉很干净,它允许我创建真正的私有函数,而不是使用_
前缀来表示方法应该被视为私有(但实际上并不是)。
这让我知道我需要哪些功能进行单元测试,哪些功能我不知道。它还可以防止我被诱惑使用应该是私有的功能。但我在其他地方看不到这种模式。
那么为什么其他人不使用这种模式呢?他们做了什么呢?
答案 0 :(得分:6)
很多人这样做。它在某种程度上被正式称为Revealing Module Pattern。
<强>优点强>
<强>缺点强>
答案 1 :(得分:0)
JavaScript中没有访问修饰符(private,protected,public), 但你可以创建你的对象 一些变量和方法不会从外部访问。
var ExampleObject = function() {
var privateVariable = "I am Private Variable" // this variable can be accessed only in ExampleObject instance;
this.publicVariable = "I am Public Variable" // this way you can access variable from outside;
// NOW FOR METHODS
// this method only could be accessed inside instance of ExampleObject
var privateFunction = function() {
return "I am Private Function";
}
// this method could be accessed outside and inside instance of ExampleObject
// also notice that this method can return private variables or functions of instance to outside of instance
this.publicFunction = function() {
alert(privateFunction())
return privateVariable;
}
}
var instanceExample = new ExampleObject();
<!-- alert(instanceExample.privateFunction()) // will throw Uncaught TypeError: instanceExample.privateFunction is not a function -->
alert(instanceExample.publicFunction())