Javascript面向對象編程實現:
1.類的聲明:
function test1(){
this.p1 = "p1";
this.p2 = "p2";
this.f1 = function(){ alert("f1"); }
this.f2 = function(){ akert("f2"); }
}
上面的代碼聲明了兩個公有的屬性p1和p2,兩個方法f1和f2.
如何申明私有變量呢?
function test1(){
var _test = "test";
this.p1 = "p1";
this.p2 = "p2";
this.f1 = function(){ alert("f1"); }
this.f2 = function(){ akert("f2"); }
}
上面的代碼通過var關鍵字聲明了一個局部變量_test,其作用域是test1類定義的內部,對外不公開.
如何申明類的靜態變量和靜態方法呢?
test1.staticProp = "static var";
test1.staticMethod = function(){
alert("static method");
}
還可以通過Javascript中對象的prototype屬性來申明類的實例屬性或方法:
test1.prototype.prop2 = "prop2";
test2.prototype.method2 = function(){
alert(" this.prop2");
}
` 利用prototype屬性,可以實現另一種類的聲明方法:
function test(){}
test.prototype = {
p1 : "p1",
p2 : "p2",
f1 : function(){
alert("f1");
}
}
如何實現類的繼承呢?通過復制父類的所有屬性和方法來實現子類的繼承:
用for(....in ....)方法來實現遍歷父類所有的屬性和方法
這裡看看我如何讓新聲明的test1類繼承test類的:
function test1(){}//定義新聲明的test1類.
var p;
for(p in test.prototype){ //遍歷父類的所有屬性和方法
test1.prototype[p] = test.prtotype[p]; //把父類的所有屬性和方法全部復制到新聲明的子類test1中
}
test1.prototype.newMethod = function(){//定義新聲明的子類test1的新方法
alert("new method");
}
其實prototype框架已經幫我們實現了這種繼承,我們來看看它是如何實現的:
Object.extend = function(destination, source){
for(property in source){
destination[property] = source[property];
}
return destination;
}
Prototype框架為Object對象定義了extend方法,該方法有兩個參數destination和source,分別對應於子類和父類,所以我們前面所講的test1繼承test可以簡化代碼如下:
function test1(){
test1.prototype = Object.extend({
newMethod : function(){
alert("new method");
}
},
test.prototype
);
如果我們改變一下上述代碼中extend方法中的兩個參數的順序:
function test1(){
test1.prototype = Object.extend(
test.prototype,
{
newMethod : function(){
alert("new method");
}
},
);
可以發現,對於test1子類來說效果是相同的..
但是,我們進一步會發現,父類test確擁有了子類test1的新增方法,雖然這不是我們最初想要的繼承效果,但是這種方法卻使我們有了擴展對象屬性或者方法的手段了,不是嗎?