JS中是没有私有成员的概念的,一个对象的所有的属性都是公有的,任何函数都可以访问,修改,删除这些属性或者是为对象添加新的属性(成员).
主要有两种方式为一个新的对象添加成员,
1. 构造函数(通常用来实例化公有实例变量,其中this 用来向新对象添加成员)
function Person (name,age) {
this .name = name;
this .age = age;
}
2. 原型(通常用来添加公有的方法)
Person.prototype.sayHi = function () {
alert("hello" );
}
上述两种方式添加的对象的成员都是公有的.
JS虽然没有私有成员的概念,但是却有私有变量的概念.任何在函数中定义的变量
都是私有变量,在函数的外部无法访问这些私有变量,其中包括:函数的参数
(parameter),函数中定义的变量(var ),函数内部定义的函数(inner function ).
如:
function sum (num1,num2) {
var result = num1 + num2;
return result;
}
形参num1,num2和局部变量result是私有变量,只可以在函数内部访问,不可以在函数外部访问.
构造函数中的私有变量实现隐藏数据:
function Student (parameter1,parameter2) {
this .name = parameter1;
this .score = parameter2;
var classes = "测绘132" ;
var school = "淮海工学院" ;
function getClasses () {
console.log(classes);
}
this .publicMethod = function () {
console.log(school);
getClasses();
}
}
var weigenshang = new Student("魏根上" ,93 );
console.log(weigenshang.school);
console.log(weigenshang.classes);
console.log(weigenshang.name);
console.log(weigenshang.score);
weigenshang.publicMethod();
----------------------------------
再如:
function Person (name) {
this .getName = function () {
return name;
};
this .setName = function (newName) {
name = newName;
};
}
var tom = new Person("Tom" );
alert(tom.name);
Person()定义了两个特权方法,getName(),setName()都可以在外部访问构造函数内部的私有变量name,因为这两个函数都是闭包,其作用域链中包含Person()函数的词法环境,
实际上name只是Person()构造函数中的私有变量,并不是person类对象的属性,这一点可以通过tom.name = undefined 看出来,我们只是把这种私有变量看成是对象隐藏的属性,并通过给对象添加特权方法(即闭包)来访问这些隐藏的属性(即私有变量),
但是在构造函数中定义特权方法有一个缺点就是必须使用构造函数模式才可以,而构造函数模式的缺点就是针对每一个实例都会创建同样一组新方法.
使用静态私有变量实现特权方法就可以避免这个问题,这也是下一章的内容.