公有属性:
当我们定义一个对象后,使用对象的人在实例化之后可以访问到对象内部的属性;
私有属性:
对象的属性不能被访问者看到;只能在函数内部使用。好处就是安全,就类似闭包中的函数一样,减少污染。通过var 变量来实现;如:
1 var className='用户对象‘;
function Person(name){
//私有属性,只能在对象构造函数内部使用
var className = "用户对象";
//公有属性,在对象实例化后调用
this.name = name;
//私有方法
var privateFunction = function(){
alert(this.name); //公有属性
alert(className); //正确 直接通过变量名访问
alert(this.className); //undefined 错误 不能这样访问
}
//公有方法
this.publicFunction = function(){
alert(this.name); //公有属性
alert(className); //正确 直接通过变量名访问
alert(this.className); //undefined 错误 不能这样访问
}
}
私有变量:任何函数中定义的变量都可以认为是私有变量,因为不能在函数外部访问到;
包括: 函数的参数
局部变量
函数内部定义的其他变量
特权方法:有权访问私有变量和私有函数的公有方法;
方法一:
<script>
function MyObject=10;
// 私有变量和私有函数
var privateFunction(){
return false;
}
// 特权方法
this.publicMethod=function(){
privateVariable++;
return privateFunction();
}
// 因为特权方法作为闭包有权访问在构造函数中定义的所有变量和函数
</script>
知识点二:
利用私有和特权成员,可以隐藏那些不应该被直接修改的数据;
如:
<script>
function Person(name){
this.getName=function(){
return name;
};
this.setName=function(value){
name=value;
};
}
var person=new Person('Nicholas');
console.log(person.getName());//Nicholas;
person.setName('grey');
console.log(person.getName());//grey;
// getName()和setName()为特权方法,可以被外面访问;私有变量name在person的每个实例中都不相同,因为每次调用构造函数都会重建这两个方法;
</script>
案例:
<script>
function Person(name){
var className='用户';//私有属性
this.name=name;//公有属性
var privateFunction=function(){
console.log(this.name);//私有方法
}
this.publicFunction=function(){//公有方法
console.log(this.name);//xiaowang
console.log(className);//用户
console.log(this.className);//undefined
}
}
var person=new Person('xiaowang');
console.log(person.className);//undefined
console.log(person.name);//xiaowang
console.log(person.publicFunction());//undefined
console.log(person.privateFunction());// person.privateFunction is not a function
</script>