手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >javascript 用原型继承来实现对象系统
javascript 用原型继承来实现对象系统
摘要:javascript中,对象没有原型,而构造器有原型原型的含义:如果构造器有一个原型对象A,则由该构造器创建的实例都必然复制自A复制代码代码...

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

});

【javascript 用原型继承来实现对象系统】相关文章:

javascript字符串与数组转换汇总

JavaScript AOP编程实例

javascript无刷新评论实现方法

javascript实现删除前弹出确认框

javascript实现树形菜单的方法

Javascript类型转换的规则实例解析

javasript实现密码的隐藏与显示

JavaScript 预解析的原理及实现

javascript实现动态改变层大小的方法

JavaScript常用数组算法小结

精品推荐
分类导航