JS中的私有成員-01

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){
        // 定義公有成員name,score
        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);
    // weigenshang.getClasses();        //報錯,不可以訪問私有函數.
    console.log(weigenshang.school);    //unfined
    console.log(weigenshang.classes);   //unfined
    console.log(weigenshang.name);      //"魏根上"
    console.log(weigenshang.score);     //93
    weigenshang.publicMethod();         // 通過特權方法來訪問私有成員
    ----------------------------------
    再如:
    function Person(name){
        this.getName = function(){
            return name;
        };
        this.setName = function(newName){
            name = newName;
        };
    }
    var tom = new Person("Tom");
    alert(tom.name);  // undefined 
    Person()定義了兩個特權方法,getName(),setName()都可以在外部訪問構造函數內部的私有變量name,因爲這兩個函數都是閉包,其作用域鏈中包含Person()函數的詞法環境,

實際上name只是Person()構造函數中的私有變量,並不是person類對象的屬性,這一點可以通過tom.name = undefined看出來,我們只是把這種私有變量看成是對象隱藏的屬性,並通過給對象添加特權方法(即閉包)來訪問這些隱藏的屬性(即私有變量),


但是在構造函數中定義特權方法有一個缺點就是必須使用構造函數模式纔可以,而構造函數模式的缺點就是針對每一個實例都會創建同樣一組新方法.

使用靜態私有變量實現特權方法就可以避免這個問題,這也是下一章的內容.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章