1. 程式人生 > >javascript面向物件程式設計--設計超類和子類,設計元類

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());//編輯錯誤,沒有這個成員