定義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();