首页 > 语言 > JavaScript > 正文

老生常谈JS中的继承及实现代码

2024-05-06 15:32:51
字体:
来源:转载
供稿:网友

JS虽然不像是JAVA那种强类型的语言,但也有着与JAVA类型的继承属性,那么JS中的继承是如何实现的呢?

一、构造函数继承

在构造函数中,同样属于两个新创建的函数,也是不相等的 function Fn(name){  this.name = name;  this.show = function(){   alert(this.name);  } } var obj1 = new Fn("AAA"); var obj2 = new Fn("BBB"); console.log(obj1.show==obj2.show);  //false 此时可以看出构造函数的多次创建会产生多个相同函数,造成冗余太多。 利用原型prototype解决。首先观察prototype是什么东西 function Fn(){} console.log(Fn.prototype); //constructor表示当前的函数属于谁 //__proto__ == [[prototype]],书面用语,表示原型指针 var fn1 = new Fn(); var fn2 = new Fn(); Fn.prototype.show = function(){  alert(1); } console.log(fn1.show==fn2.show);  //ture 此时,任何一个对象的原型上都有了show方法,由此得出,构造函数Fn.prototype身上的添加的方法,相当于添加到了所有的Fn身上。

二、call和applay继承

function Father(skill){  this.skill = skill;  this.show = function(){   alert("我会"+this.skill);  } } var father = new Father("绝世木匠"); function Son(abc){  //这里的this指向函数Son的实例化对象  //将Father里面的this改变成指向Son的实例化对象,当相遇将father里面所有的属性和方法都复制到了son身上  //Father.call(this,abc);//继承结束,call适合固定参数的继承  //Father.apply(this,arguments);//继承结束,apply适合不定参数的继承 } father.show() var son = new Son("一般木匠"); son.show();

三、原型链继承(demo)

这个的么实现一个一个简单的拖拽,a->b的一个继承。把a的功能继承给b。

HTML:

 <div id="drag1"></div> <div id="drag2"></div>

CSS:

*{margin: 0;padding: 0;} #drag1{width: 100px;height: 100px;background: red;position: absolute;} #drag2{width: 100px;height: 100px;background: black;position: absolute;left: 500px;}

 JS:  

function Drag(){}  Drag.prototype={   constructor:Drag,   init:function(id){    this.ele=document.getElementById(id);    this.cliW=document.documentElement.clientWidth||document.body.clientWidth;    this.cliH=document.documentElement.clientHeight||document.body.clientHeight;    var that=this;    this.ele.onmousedown=function(e){     var e=event||window.event;     that.disX=e.offsetX;     that.disY=e.offsetY;     document.onmousemove=function(e){      var e=event||window.event;      that.move(e);     }     that.ele.onmouseup=function(){      document.onmousemove=null;     }    }     },   move:function(e){    this.x=e.clientX-this.disX;    this.y=e.clientY-this.disY;    this.x=this.x<0?this.x=0:this.x;    this.y=this.y<0?this.y=0:this.y;    this.x=this.x>this.cliW-this.ele.offsetWidth?this.x=this.cliW-this.ele.offsetWidth:this.x;    this.y=this.y>this.cliH-this.ele.offsetHeight?this.y=this.cliH-this.ele.offsetHeight:this.y;    this.ele.style.left=this.x+'px';    this.ele.style.top=this.y+'px';   }  }  new Drag().init('drag1')  function ChidrenDrag(){}  ChidrenDrag.prototype=new Drag()  new ChidrenDrag().init('drag2')            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选