JavaScript實現類的private、public

定義Js中的類,實際上用的是function,這個語法其實是用來定義函數的。不同於定義函數的是,我們可以在function中通過this.xxx的方式來定義屬性和方法。

this.xxx只能定義公有屬性和方法,那私有屬性和方法怎麼辦呢?這個可以用到js閉包的知識來解決

對象可以由初始化對象的方法 -- 構造函數產生。構造函數提供在其他編程語言中類提供的特性,包括靜態變量和方法。


Public
對象的成員都是public成員。任何對象都可以訪問,修改,刪除這些成員或添加新成員。主要有兩種方式來在一個新對象裏放置成員:
在構造函數裏
這種技術通常用來初始化public實例變量。構造函數的“this”變量用來給對象添加成員。

functin Container(param) {   
    this.member = param;   
}  
這樣,如果我們構造一個新對象var myContainer = new Container('abc'),則myContainer.member爲'abc'。

在prototype裏
這種技術通常用來添加public方法。當尋找一個成員並且它不在對象本身裏時,則從對象的構造函數的prototype成員裏找。
prototype機制用來做繼承。爲了添加一個方法到構造函數創建的所有對象裏,只需添加到構造函數的prototype:

Container.prototype.stamp = function (string) {   
    return this.member + string;   
}  
這樣,我們可以調用該方法myContainer.stamp('def'),結果爲'abcdef'。


Private
private成員由構造函數產生。普通的var變量和構造函數的參數都稱爲private成員。

function Container(param) {   
    this.member = param;   
    var secret = 3;   
    var that = this;   
}  

該構造函數創建了3個private實例變量: param,secret和that。它們被添加到對象中,但是不能被外部訪問,也不能被該對象自己的 public方法訪問。它們只能由private方法訪問。private方法是構造函數的內部方法。

function People () {
    this.name = "Yorhom";

    var age = 16;

    this.getName = function () {
        return this.name
    };

    this.getAge = function () {
        return age;
    };
}

var yorhom = new People();
// undefined
alert(yorhom.age);
// 16
alert(yorhom.getAge())


例:編寫js的類,使其擁有public和private類型的屬性和方法

function Person(_name,_age,_sex,_salary){  
    //public  
    this.name = _name;  
    this.age = _age;  
  
    //privare  
    var sex = _sex;  
    var salary = _salary;  
  
    //public method  
    this.getName = function(){  
        return this.name;  
    }  
  
    this.getAge = function(){  
        return this.age;  
    }  
  
    //private methd  
    function getSex(){  
        return sex;  
    }  
  
    function getSalary(){  
        return salary;  
    }  
  
    this.display = function(){  
        document.write(this.getName() + "---" + this.getAge() + "---" + getSex() + "----" + getSalary());  
    }  
  
}  
  
var smirk = new Person("zy","21","f","5000");  
smirk.display();  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章