javascript原型鏈與特權方法
function ClassA() { var value=4; this.getValue= function() { return value; } this.setValue= function(value) { this.value=value; } } var instance= new ClassA(); document.write(instance.getValue()); classA.setValue(1); document.write(instance.getValue()); document.write(instance.value);
輸出結果為:4,4,1。
原因是:var value 是私人變數,它與this.value不是同一個值。
下面我們分析下對象執行個體的建立與私人變數如何訪問。
1.執行個體屬性與原型屬性
javascript對象建立執行個體時,執行個體屬性和方法只有通過建構函式中的this,才可以賦給執行個體。如果想建立共用的屬性或者方法,那麼可以通過原型鏈共用。
建立共用的屬性:
function ClassA() { var value=4; this.getValue= function() { return value; } this.setValue= function(value) { this.value=value; } } ClassA.prototype.value=1;//共用的value var instance1=new ClassA(),// instance2=new ClassA(); consloe.log(instance1.value);//1 consloe.log(instance2.value);//1 console.log(ClassA.value);//undefined
那麼ClassA()中的私人屬性value我們可以通過ClassA.value訪問嗎?答案是不能。
我們分析下對象執行個體中標識符的尋找。執行個體尋找一個屬性時,分為兩步:
(1).在執行個體本身的執行個體屬性中尋找。
(2).如果尋找不到執行個體屬性,那麼順著原型鏈會找到對象的原型。
ClassA.value 在ClassA的執行個體屬性中尋找不到,那麼繼續尋找原型鏈,ClassA是Object的執行個體,因此會尋找Object.prototype.value,顯然值為undefined。
2.私人變數的訪問
我們知道,javascript沒有塊級範圍,但是我們可以通過函數來類比塊級範圍。而塊級範圍裡面的變數,稱為私人變數。私人變數,外部無法訪問,我們可以在函數內部
產生特權方法(特權方法:能夠訪問私人變數的方法),這裡的特權方法就是this.getValue();通過建構函式建立,是建立特權方法的一種方法。
建立特權方法的另外一種方式就是:靜態方法。
function ClassA() { var value=4; this.getValue= function() { return value; } this.setValue= function(value) { this.value=value; } ClassA.getValue=function(){ //靜態方法 return value; } }