让学习“上瘾”,成为更好的自己!!!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>私有变量</title>
<script>
/*
严格来讲,JavaScript中没有私有成员的概念,所有对象属性都是公有的
但有“私有变量” --> 任何在函数中定义变量,都可以认为是私有变量
私有变量:函数的参数、局部变量和在函数内部定义的其他函数
有权访问私有变量和私有函数的共有方法称为“特权方法”
*/
function add(num1, num2){
var sum = num1 + num2;
return sum;
}
// 函数内部有3个私有变量: num1, num2, sum
// 函数内部可以访问这几个变量,但在函数外部则不能访问他们
// 特权方法
// way 1: 在构造函数中定义特权方法
// 基本模式如下:
// function MyObject(){
// // 私有变量和私有函数
// var privateVariable = 10;
// function privateFunction(){
// return false;
// }
// // 特权方法:有权访问私有变量和私有函数的公有方法称为“特权方法”
// this.publicMethod = function(){
// privateVariable ++;
// console.log(privateVariable);
// return privateFunction();
// };
// }
// var obj1 = new MyObject();
// console.log(obj1.privateVariable); // undefined
// console.log(MyObject.privateVariable); // undefined
// console.log(obj1.publicMethod());
// // 在创建MyObject的实例后,除了使用publicMethod()方法这个方式外,没有任何方法可以直接访问privateVariable and privateFunction
// 使用私有和特权成员,可以隐藏那些不应该被直接修改的数据
// function Person(name){
// this.getName = function(){
// return name;
// };
// this.setName = function(value){
// name = value;
// };
// }
// var person = new Person('kai');
// console.log(person.getName());
// person.setName('lice');
// console.log(person.getName());
// way 2: 通过在私有作用域中定义的私有变量或函数,同样也可以创建特权方法
// 与在构造函数中定义特权方法的主要区别 --> 私有变量和函数是由实例共享的
// 基本模式如下:
(function(){
// 私有变量和私有函数
var privateVariable = 10;
function privateFunction(){
return false;
}
// 构造函数
// 这里必须这么写:函数声明只能创建局部函数,而函数表达式可以创建全局函数
MyObject = function(){
};
// 特权方法
MyObject.prototype.publicMethod = function(){
privateVariable ++;
return privateFunction();
};
// 声明MyObject时不使用var关键字
// 记住:初始化未经声明的变量,总会创建一个全局变量
})();
(function(){
var name = ''; // name是一个静态的、由所有实例共享的属性
Person = function(value){
name = value;
}
Person.prototype.getName = function(){
return name;
}
Person.prototype.setName = function(value){
name = value;
}
})();
var person1 = new Person('kai');
console.log(Person.name);
console.log(person1.getName());
person1.setName('Mick');
console.log(person1.getName());
// 调用setName()方法或者新建一个person实例都会赋予name属性一个新值,结果是所有的实例都会返回相同的值
var person2 = new Person('lice');
console.log(person2.getName()); // lice
console.log(person1.getName()); // lice --> 每个实例都没有自己的私有变量
</script>
</head>
<body>
</body>
</html>