私有变量包括:函数的参数、局部变量和在函数内部定义的其他函数
function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
在这个函数内部,有3个私有变量:num1、num2和sum。在函数内部可以访问这几个变量,但在函数外部则不能访问他们。
如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量。利用这一点,就可以创建用于访问私有变量的公有方法(称为特权方法)。
1.在构造函数中定义特权方法:
function MyObject() {
// 私有变量和私有函数
var privateVariable = 10;
function privateFunction() {
return false;
}
//特权方法
this.publicMethod = function () {
privateVariable++;
return privateFunction();
};
}
2.静态私有变量实现特权方法
通过在私有作用域中定义私有变量或函数,实现创建特权方法:
(function () {
// 私有变量和私有函数
var privateVariable = 10;
function privateFunction() {
return false;
}
// 构造函数
MyObject = function () { // 初始化未声明的变量,总是会创建一个全局变量,能够在私有域之外被访问到
};
// 公有/特权方法
MyObject.prototype.publicMethod = function () { // 使用函数表达式定义构造函数,因为函数声明只能创建局部函数
privateVariable++;
return privateFunction();
};
})();
由于特权方法实在原型上定义的,因此所有实例都使用同一个函数。而这个特权方法,作为一个闭包,总是保存着对包含作用域的引用。
3.模块模式
模块模式是为单例创建私有变量和特权方法的
var singleton = function () {
// 私有变量和私有函数
var privateVariable = 10;
function privateFunction() {
return false;
}
// 特权/公有方法和属性
return {
publicProperty: true,
publicMethod: function () {
privateVariable++;
return privateFunction();
}
};
}();
这个模块模式使用了一个返回对象的匿名函数。
4.增强的模块模式
有人改进了模块模式,即在返回对象之前加入对其增强的代码。这种方式适合那些单例必须是某种类型的实例的情况。
var singleton = function () {
// 私有变量和私有函数
var privateVariable = 10;
function privateFunction() {
return false;
}
// 创建对象
var object = new CustomType();
// 特权/公有方法和属性
object.publicProperty = true;
object.publicMethod = function () {
privateVariable++;
return privateFunction();
}
return object;
}();
本文详细介绍了JavaScript中如何使用私有变量和特权方法,包括构造函数、静态私有变量、模块模式和增强模块模式的实现方式。通过具体代码示例,展示了不同场景下私有变量的访问和保护策略。

4337

被折叠的 条评论
为什么被折叠?



