本文解析如何在 JavaScript 中定义真正的私有方法和私有变量。通过在构造函数内部使用 function 声明的方法以及 var 声明的变量,利用作用域链实现封装。示例展示了私有方法无法被实例直接调用,以及如何通过闭包模拟 getter 和 setter 来安全访问内部状态,帮助理解 JS 的作用域、this 指向及闭包机制。
JavaScript 私有方法的定义与限制
过去常认为在 JavaScript 中所有方法都是公开的,无法从技术上定义私有方法,但实际证明这一观点是错误的。
具体实现代码如下:
var Person = function(name,sex){
this.name = name;
this.sex = sex;
var _privateVariable = "";//私有变量
//构造器中定义的方法,即为私有方法
function privateMethod(){
_privateVariable = "private value";
alert("私有方法被调用!私有成员值:" + _privateVariable);
}
privateMethod(); //构造器内部可以调用私有方法
}
Person.prototype.sayHello = function(){
alert("姓名:" + this.name + ",性别:" + this.sex);
}
var p = new Person("菩提树下的杨过","男");
p.sayHello();
//p.privateMethod();//这里将报错,私成方法无法被实例调用
alert(p._privateVariable);//显示: undefined说明:在类的构造函数内部定义的 function 即为私有方法;而在构造函数内使用 var 声明的变量,同样相当于私有变量。需要注意的是,这与 C# 等强类型语言中的私有成员概念存在差异,例如无法在构造函数之外的其他方法中直接访问这些私有成员。
利用闭包模拟私有属性的 Get/Set 方法
类似地,我们可以利用这一机制实现类似 set、get 属性的封装效果。
代码如下:
var Person = function(){
var salary = 0.0;
this.setSalary = function(value){
salary = value;
}
this.getSalary = function(){
return salary;
}
}
var p = new Person();
p.setSalary(1000);
alert(p.getSalary());//返回1000
alert(p.salary);//返回undefined注:JavaScript 中的“变量作用域”、“函数调用上下文(this)”、“闭包”、“原型链”这几个概念确实值得深入理解。跨越这些难点后,JavaScript 新手的水平预计将提升到一个新台阶。