构造函数的私有属性与特权方法
3.构造函数的私有属性与特权方法
=========================
**知识点**
1.私有属性
2.特权方法
> 注: 因为js原生并不支持以上特征,所以必须通过其它语法模拟来实现
-----------------------------------------------------
1.私有属性
--------
- 即通过构造函数实例不可访问的属性
- 通过函数*局部变量*来模拟
-----------------------------------------------------
2.特权方法
--------
- 即可以访问函数局部变量的函数
- 通过:*闭包*来模拟
-----------------------------------------------------
### 示例源码: code/demo03.html
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>构造函数的私有属性与特权方法</title>
</head>
<body>
<script>
// javascript并不像其它语言那样有私有,保护,公共等属性成员
// 但是可以通过一些技术来模拟来实现
// 正常情况下, 对象中所有成员,外部都可以访问的
// 构造函数
var Stu1 = function (name) {
this.name = name;
this.getName = function () {
return this.name;
};
};
var stu1 = new Stu1('Peter');
console.log(stu1.name);
console.log(stu1.getName());
// 现在假定构造函数中的 name 是私有成员, 不允许外部通过对象来访问,怎么办?
// 直接将 name 声明为函数中的局部变量即可: var name = name; 外部就无法访问了
// 而函数内的方法,仍可以访问这个局部变量, 这就形成了一个闭包
// 闭包,是指一个函数允许访问另外一个函数中的成员,广义上讲,闭包可以访问声明它的作用域中的所有成员
// 关于闭包的知识,如果你感觉到陌生, 请观看我的另一个关于函数和闭包的教学视频
// 下面我们来改造 Stu构造函数
var Stu2 = function (userName) {
// 私有成员, this 改成: var
var name = userName;
// 因为这个内部方法可以访问私有成员,所以它还有一个清新脱俗的名称: "特权方法"
this.getName = function () {
// 闭包可访问到私有成员name,并返回
return name;
};
};
var stu2 = new Stu2('Zhu');
// 外部是不能直接访问到函数变量的
console.log(stu2.name); // undefined
// 构造函数中的闭包,提供了私有成员的访问接口
console.log(stu2.getName()); // undefined
</script>
</body>
</html>
```