JS
//【示例1】在下面示例中,包含在函数f()中的变n和函数e()都不能够被外界访问,不过函数e()可以访问私有变量n。
function f(){ // 外部函数
var n = 1; // 私有变量
function e(){ // 私有函数
n++;
};
e(); // 内部调用私有函数
return n; // 返回私有变量n的值
}
function f(){ // 外部函数
var n = 1; // 私有变量
function e(){ // 私有函数
return ++n;
};
e(); // 内部调用私有函数
return e; // 返回私有函数
}
var e = f(); // 获取私有函数
alert(e()); // 外部调用私有函数
//【示例2】根据函数特性,用户可以把上节示例中的私有数据使用函数作用域和闭包进行封装。具体方法:在函数结构体内部定义变量,这些变量可以被定义该作用域中的所有函数访问。
var Card = function( name, sex, work, detail ){ // 安全的类
var _name = name, _sex = sex, _work = work, _detail = detail;
// 私有属性
function _checkName( _name ){ // 私有方法
}
function _checkSex( _sex ){ // 私有方法
}
function _checkWork( _work ){ // 私有方法
}
function _checkDetail( _detail ){ // 私有方法
}
if(!_checkName( _name ) ) throw new Error( "name值非法" )
else {
this.name = _name;
}
this.sex = _checkSex( _sex );
this.work = _checkWork( _work );
this.detail = _checkDetail( _detail );
}
Card.prototype = {
// 公共方法
}
var Card = function( name, sex, work, detail ){
var _name = name, _sex = sex, _work = work, _detail = detail;
function _checkName( _name ){
}
this.checkName = function(){ // 返回私有方法,实现外部调用
return _checkName
}
}
//【示例3】
var Card = function(){ // 超类
var _name = 1; // 私有属性
function _checkName(){ // 私有方法
return _name;
}
this.checkName = function(){ // 公共方法
return _name; // 可以访问私有属性
}
}
function F(){ // 子类
Card.call(this); // 使用类继承方法继承类Card
this.name = _name; // 访问超类中的私有属性,抛出解析错误
}
var a = new F(); // 实例化子类
alert(a.name); // 访问无效
alert(a._checkName()); // 无法访问,抛出解析错误
alert(a.checkName()); // 访问超类公共方法,间接访问私有属性和方法