博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript中的继承及实现代码
阅读量:5745 次
发布时间:2019-06-18

本文共 4316 字,大约阅读时间需要 14 分钟。

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//前端全栈学习交流圈:866109386//面向1-3经验年前端开发人员//帮助突破技术瓶颈,提升思维能力复制代码

此时,任何一个对象的原型上都有了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:

复制代码

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')//前端全栈学习交流圈:866109386//面向1-3经验年前端开发人员//帮助突破技术瓶颈,提升思维能力复制代码

四、混合继承

function Father(skill,id){  this.skill = skill;  this.id = id; } Father.prototype.show = function(){  alert("我是father,这是我的技能"+this.skill); } function Son(){  Father.apply(this,arguments); } //如果不做son的原型即成father的原型,此时会报错:son.show is not a function Son.prototype = Father.prototype; //因为,如果不让son的原型等于father的原型,son使用apply是继承不到原型上的方法 //但这是一种错误的原型继承示例,如果使用这种方式,会导致修改son原型上的show方法时,会把father身上的show也修改 //内存的堆和栈机制 Son.prototype.show = function(){  alert("我是son,这是我的技能"+this.skill); } var father = new Father("专家级铁匠","father"); var son = new Son("熟练级铁匠","son"); father.show(); son.show(); 上面的示例应该修改成以下形式: 以上红色的代码应改成: for(var i in Father.prototype){  Son.prototype[i] = Father.prototype[i]; } //遍历father的原型身上的所有方法,依次拷贝给son的原型,这种方式称为深拷贝 这种继承方式叫做混合继承,用到了for-in继承,cell和apple继承。复制代码

五、Es6的class继承(demo)

这个demo的功能和原型链继承的demo功能一样,a->b的继承

HTML:

复制代码

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:

class Drag{   constructor(id){    this.ele=document.getElementById(id);    this.init();   };   init(){    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;      that.ele.onmouseup=null;     }//前端全栈学习交流圈:866109386    }//面向1-3经验年前端开发人员   };//帮助突破技术瓶颈,提升思维能力   move(e){    this.ele.style.left=e.clientX-this.disX+"px";    this.ele.style.top=e.clientY-this.disY+"px";   }  }  new Drag("drag1");  class ExtendsDrag extends Drag{   constructor(id){    super(id);   }  }  new ExtendsDrag("drag2")复制代码

转载地址:http://iiazx.baihongyu.com/

你可能感兴趣的文章
【转】VC的MFC中重绘函数的使用总结(整理)
查看>>
JQuery日记_5.13 Sizzle选择器(六)选择器的效率
查看>>
oracle查看经常使用的系统信息
查看>>
Django_4_视图
查看>>
Linux的netstat命令使用
查看>>
lvm讲解,磁盘故障小案例
查看>>
大快网站:如何选择正确的hadoop版本
查看>>
经过这5大阶段,你离Java程序员就不远了!
查看>>
IntelliJ IDEA 连接数据库详细过程
查看>>
thymeleaf 学习笔记-基础篇
查看>>
PHP-X开发扩展
查看>>
android学习笔记——onSaveInstanceState的使用
查看>>
工作中如何做好技术积累
查看>>
怎么用sysLinux做U盘双PE+DOS??
查看>>
Spring Transactional
查看>>
shell脚本实例
查看>>
我的友情链接
查看>>
Windows Phone 7 隔离存储空间资源管理器
查看>>
Microsoft Excel 2000/2003修复工具
查看>>
apache安装报错undefined reference ssl
查看>>