公有屬性:
當我們定義一個對象后,使用對象的人在實例化之后可以訪問到對象內部的屬性;
私有屬性:
對象的屬性不能被訪問者看到;只能在函數內部使用。好處就是安全,就類似閉包中的函數一樣,減少污染。通過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>
