1.面向對象的基本了解
在面向對象(OOP,Object Oriented Programming)的程式設計中,總是從編寫類開始的,而類是對象的抽象,就是描述了對象應該具有的所有屬性和方法,本質上我們還是在編寫對象。
長篇的面向對象概念可以參考百度百科-OOP
2.JAVASCRIPT中自定義類
兩個概念:
(1) 内建類:我們的代碼運作之前就在堆中建立的類,比如Date、String、Number等;
(2) 自定義類:我們自己編寫的類。
建立一個類People:
// 不帶參數
function People(){
this.name = "dhs";
this.height = ;
this.show = function(){
alert(this.name + "||" + this.height);
}
}
// 帶參數
function People(name,height){
this.name = name;
this.height = height;
this.show = function(){
alert(this.name + "||" + this.height);
}
}
格式:
function 類名(arg_1,arg_2,…){
// 類體
}
在JS中自定義類使用function關鍵字,和自定義函數類似,不過類的屬性和方法需使用this關鍵字。
var p = new People(); // 建立一個People類的執行個體對象p
alert(p.name);
alert(p.height);
p.show();
new People() 就是調用了類People的構造函數,這個構造函數放在這個執行個體對象的constructor屬性當中,而類的構造函數就是類本身這段代碼的定義,使用p.constructor就可以驗證,但是内建類調用這個屬性,無法獲得它的定義

使用prototype屬性定義類:
function People(){}
People.prototype.name = "dhs";
People.prototype.height = ;
People.prototype.show = function(){
alert(this.name + "||" + this.height);
}
使用prototype屬性定義的類,和上面使用函數定義的方式,使用效果上一樣,但無法使用構造器參數,因為構造函數都是空的。prototype是我們建立函數(類)的時候自動添加到函數上的,這個屬性用來存放函數的構造函數、預設的屬性和父類等資訊,使用People.prototype檢視效果
從上圖可以看出來,使用prototype定義屬性和方法,是将這些屬性和方法直接放在對應的prototype屬性中,而不是添加到構造函數中,但是這些存放在prototype中的屬性和方法同樣會被執行個體對象(var p = new People())所持有,為此使用new關鍵字執行個體化的時候,是調用了類的構造函數,同時将prototype的所有屬性賦給這個新的執行個體對象。
使用 { } 建立一個執行個體對象:
var p = {
name : "dhs",
height : ,
show : function(){
alert(this.name + "||" + this.height);
}
}
這種方式建立的對象沒有prototype屬性,因為這個屬性在建立函數時會添加,它也是function對象才有屬性。也可以叫這種對象為JSON對象,它符合JSON的書寫風格。
3.用或不用this關鍵字
在定義類的時候使用this關鍵字,就是将這個屬性或方法設定為公共的屬性或方法,類似于JAVA中public,例如this.name = “dhs”。而使用var關鍵字,var name = “dhs”,則這個屬性或方法就成了局部變量或方法,隻能在函數體内部通路,就相當于私有變量了,類似于JAVA中的private,如果想要外部通路,可以定義get和set方法
function People(){
var _name = "dhs";
this.setName = function(name){
_name = name;
}
this.getName = function(){
return _name;
}
}
var p = new People(),使用p._name會得到undefined,隻有p.getName()才可以正确通路name的值,p.setName(“zzz”)可以設定_name的值。