javascript面向物件程式設計--設計超類和子類,設計元類
在javascript中,Object物件是通用類,其他所有內建物件和自定義構造物件都是專用類,即Object物件是超類,其他內建物件和自定義物件都是Object的子類,所有在javascript語言中,所有的物件都繼承Object定義的屬性和方法
Object.prototype.name='Owen';//超類的原型屬性
var d=Date.prototype;
alert(d.name);//Owen,子類繼承超類
function Me(){}
var m= Me.prototype;
alert(m.name);//Owen,子類繼承超類
例2:把父類的例項傳給子類的prototype屬性時,破會了原型構造與預設構造器的引用關係,需要進行構造器的修正
Object.prototype.name='Owen2';
function Me(){this.saying=function(){return '父類的方法'}}
function Sub(){}
Sub.prototype=new Me();//此時的Sub.prototype.constructor指向了Me類的引用
Sub.prototype.constructor=Sub;//修正子類的原型物件的構造器指回子類本身
var m=new Sub();
alert(m.name);//Owen
alert(m.saying());//父類的方法
設計元類:
元類就是類的型別,即建立型別的類,元類能夠接受 類 作為引數,返回的是類,即元類操作的物件是類,不是具體的資料
function O(){
return function(){
this.x=x;
this.get=function(){
alert(this.x);
}
}
}
var o=new O(1);//例項化元類
var f=new o();//例項化 元類 返回的類
f.get(); //1
例2:javascript核心物件Function就是一個元類
var O=new Function("this.x=1;this.y=2");
var o=new O();//例項化 返回的類
alert(o.x);//1
例3:
function F(x,y){//作為引數的類
this.x=x;
this.y=y;
}
F.prototype.add=function(){
alert(this.x+this.y);
}
function O(o,x,y){//元類
this.say=function(){ alert('元類')}//元類的本地方法
return function(){
this.say=funciton(){alert('返回類')}
var a=new o(x,y);//例項化引數類
for(var i in a){ this[i]=a[i];}
}
}
var A=new O(F,1,2);//例項化元類,此時A是一個類結構,不能通過A讀取元類本地方法say()
var B=new A();//例項化元類的返回類
A.say();//提示編輯錯誤
B.say();//返回類
B.add();//3
alert(B.x);//1
alert(B.y);//2
注意:當一個類有返回值時,如果型別是值型別,則可以訪問類的成員,也可以獲取返回值
function F(){
this.x=1;
return 2;
}
var f=new F();
alert (f.x);//1
alert(F());//2
但如果類返回的是引用型別或者是函式時,則類的成員將不可訪問,它們將成為閉包結構的私有資料
function F(){
this.x=1;
return function(){ return this.x;}
}
F.prototype.y=function(){alert(3)}
var f=new F();
alert(f.x);//訪問本地屬性x失敗,返回 undefined
alert(F()());//1,呼叫返回的函式 可以訪問本地屬性x
alert(f.y());//編輯錯誤,沒有這個成員