(function(){
let privateVariable = 10;
function privateFunction(){
return false;
}
MyObject = function(){};
MyObject.prototype.publicMethod = function(){
privateVariable++;
return privateFunction();
};
})();
- 在这个模式中,匿名函数表达是创建了一个包含构造函数及其方法的私有作用域。首先定义的是私有变量和私有函数,然后又定义了构造函数和公有方法。共有方法定义在构造函数的原型上,与典型的原型模式一样。
- 注意,这个模式定义的构造函数没有使用函数申明,使用的是函数表达式。函数申明会创建内部函数,在这里并不是必须的。基于同样的原因(但操作相反),这里申明MyObject并没有使用任何关键字。因为不使用关键字申明的变量会创建在全局作用域中,所以MyObject变成了全局变量,可以在这个私有作用域外部被访问。在严格模式下给未申明的变量赋值会导致错误。
(function(){
let name ="";
Person = function(value){
name = value;
};
Person.prototype.getName = function(){
return name;
};
Person.prototype.setName = function(value){
name = value;
}
})();
let person1 = new Person('Nicholas');
console.log(person1.getName());
person1.setName("Matt");
console.log(person1.getName());
let person2 = new Person('Michael');
console.log(person1.geName());
console.log(person2.getName());
- 这里的Person构造函数可以访问私有变量name,跟getName()和setName()方法一样。使用这种模式,name变成了静态变量,可供所有实例使用。这意味着在任何实例上调用setName()修改这个变量都会影响其他实例。调用setName()或创建新的Person实例都要把name变量设置为一个新值。而所有实例都会返回相同的值。
- 像这样创建静态私有变量可以利用原型更好地重用代码,只是每个实例没有了自己的私有变量。最终,到底是把私有变量放在实例中,还是作为静态私有变量,都需要根据自己的需求来确定。
- 注意:使用闭包和私有变量会导致作用域链变长,作用域链越长,则查找变量所需的时间也越多。