|
对象系统中的继承特性有三种方式:基于类,基于原型,基于元类
javascript中,对象没有原型,而构造器有原型 原型的含义:如果构造器有一个原型对象 A,则由该构造器创建的实例都必然复制自A 复制代码 代码如下: /*申明2个构造器*/ var flower=function(){ this.name="nokia"; } var flower2=function(){ this.age=22; } /*原型链*/ flower2.prototype=new flower(); /*根据刚才原型的定义,实例obj必然复制自new flower();*/ obj=new flowe2(); /*从父类继承的属性*/ alert(obj.name); //==>"nokia" alert(obj.age); //==>22 一个构造器产生的实例,其constructor属性默认总是指向该构造器 alert(obj.constructor);//==>flower 构造器原型的constructor属性 指向构造器本身 alert(flower.prototype.constructor==flower);//==>true constructor会与原型继承发生的冲突 复制代码 代码如下: function flower(){} function flower2(){} flower2.prototype=new flower(); var obj1=new flower(); var obj2=new flower2(); /*问题出现了,2个实例的constructor属性都指向flower*/ alert(obj1.constructor==obj2.constructor); /*obj1和obj2是不同的构造器产生的实例,缺指向相同的构造器,显然出了问题*/ 解决的方法 复制代码 代码如下: flower2.prototype=new flower(); /*重置原型后,修改原型的constructor属性*/ flower2.prototype.constructor=flower2 或每次构造实例时都重写constructor属性 function flower2(){ this.constructor=arguments.callee; } flower2.prototype=new flower(); 此外原型继承没有提供调用父类的方法 然而我们基于原型继承,通过静态变量记录父类来弥补这一缺陷 复制代码 代码如下: var Class={ create:function() { var _class=function() { this.init.apply(this,arguments); } _class.prototype.init=Function.prototype.init; try{ return _class; }finally{ _class=null; } } }; //默认构造函数 Function.prototype.init=function(){} //方法扩展 Function.prototype.extend=function(list) { for(var i in list)this.prototype[i]=list[i]; return this; } //多级继承 Function.prototype.inherits=function(parent) { //继承的深度级别 var _depth=0; //方法属性移植 this.extend(new parent()); //初始化构造函数 类的继承通常不继承构造函数 this.prototype.init=Function.prototype.init; //类的静态父类 this.parent=parent; //执行父类函数 this.prototype.parent=function(name) { //若没有参数则执行构造函数 if(!name)name='init'; //即将执行的父类 var _parent=parent; //若当前已经在父类中执行则继续向上寻找超类 if(_depth) { for(var i=0;i<_depth;i++) { _parent=_parent.parent; } } //设置好级别 _depth++; try{ //执行函数并返回值 return _parent.prototype[name].apply(this,Array.prototype.slice.apply(arguments,[1])); }catch(e){ throw(e); }finally{ //恢复级别 _depth--; } } return this; } 例子: 复制代码 代码如下: //创建名为class1的构造器 var class1=Class.create().extend({ b:function() { alert('clas'); alert(this.c); }, c:100 }); //创建"对象"(构造器)的实例 var s=new class1(); s.b();// ==>"clas",100 继承父类,并调用父类的方法: 复制代码 代码如下: var test=Class.create().inherits(class1).extend({ b:function() { alert('test'); this.parent('b') }, c:110 });
|
|