一、JS的“類”
function a(){
var v=1;
this.getValue=function(){
return v;
}
}
var b=new a();
alert(b.getValue());
那既然有個公共函數,那私有函數呢,改造a類:
function a(){
var v=1;
setValue();
function setValue(){
v=9;
}
this.getValue=function(){
return v;
}
}
var b=new a();
alert(b.getValue());
function a(){
var v=1;
this.setValue=function (value){
v=value;
}
this.getValue=function(){
return v;
}
}
var b=new a();
b.setValue(99);
alert(b.getValue());
這時彈框爲99.
二、JS的“繼承”
1.prototype實現繼承(原型繼承)
function a(){
function getData(){
return 100;
}
this.getValue=function(){
return 123;
}
this.value=9999;
}
aa.prototype=new a();//類a的實例是aa的原型
function aa(){
}
var b=new aa();
alert(b.getValue());//彈框爲123
alert(b.value);//彈框爲9999
//alert(b.getData());//無法繼承非公共函數
類aa中並沒有getValue函數,但是aa的實例依然可以調用該函數,這便是js的原型繼承。
function a(){
this.value=[100,200];
}
aa.prototype=new a();
function aa(){
}
var b=new aa();
var e=new aa();
b.value.push(300,400);
alert(b.value);//彈框100,200,300,400
alert(e.value);//彈框100,200,300,400
2.對象冒充式繼承(使用call或apply函數實現)
使用js提供的call()及apply()函數實現繼承。這兩者的第一個參數都是要實現繼承的子類對象(一般傳“this”),剩下的參數略有不同:
call(this, parameter1, parameter2, parameter3... )
function a(data1,data2){
this.value=data1+data2;
}
function aa(data1,data2){
a.call(this,data1,data2);
}
function bb(data1,data2){
a.apply(this,new Array(data1,data2));
}
var b=new aa(10,20);
var e=new bb(100,200);
alert(b.value);//彈框30
alert(e.value);//彈框300
function parentA(data1,data2){
this.value=data1+data2;
}
function parentB(data1,data2){
this.value=data1*data2;
}
function aa(data1,data2){
parentA.call(this,data1,data2);
parentB.call(this,data1,data2);
}
var b=new aa(10,20);
alert(b.value);//彈框200
三、JS的封裝與多態
function calc(value1,value2){
this.data1=value1;
this.data2=value2;
this.GetResult;
this.toString=function(){
if(this.GetResult)
return this.GetResult()+"";
return "0";
}
}
function sumCalc(value1,value2){
calc.call(this,value1,value2)
this.GetResult=function(){
return this.data1+this.data2;
}
}
function productCalc(value1,value2){
calc.call(this,value1,value2)
this.GetResult=function(){
return this.data1*this.data2;
}
}
var s=new sumCalc(2,3);
alert(s.toString()); //彈框5
var p=new productCalc(2,3);
alert(p.toString()); //彈框6
四、JS中的“委託”
function calc(value1,value2){
this.data1=value1;
this.data2=value2;
this.GetResult;
this.ToString=function(){
if(this.GetResult)
return this.GetResult(this.data1,this.data2)+"";
return "0";
}
}
function GetSum(value1,value2){
return value1+value2;
}
var c=new calc(2,3);
c.GetResult=GetSum;
alert(c.ToString()); //彈框爲5
如上,GetResult函數被賦予了一個新函數GetSum(),當calc類執行GetResult()函數時,便會調用該委託的函數-----GetSum()。