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());//编辑错误,没有这个成员

猜你喜欢

转载自blog.csdn.net/wenmin1987/article/details/83474914
今日推荐