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看出來,我們只是把這種私有變量看成是對象隱藏的屬性,並通過給對象添加特權方法(即閉包)來訪問這些隱藏的屬性(即私有變量),
但是在構造函數中定義特權方法有一個缺點就是必須使用構造函數模式纔可以,而構造函數模式的缺點就是針對每一個實例都會創建同樣一組新方法.
使用靜態私有變量實現特權方法就可以避免這個問題,這也是下一章的內容.