函数的两种继承方式
一、原型
我们在创建每一个函数的时候,都会有一个原型对象,即prototype.
可以看出,函数拥有一个constructor的属性,这个属性指向了构造函数Drag,即函数本身,还有一个属性为__proto__,这个后面再说。
问题:现在有a和b两个属性,要求b可以继承a的所有属性?接下来我用两种继承方式实现。
二、原型链继承
如果要b继承a的属性。只要构造一个函数b,function b(){}; b.prototype=new a;
1.html代码
1 <div id=”drag1″></div> 2 <div id=”drag2″></div>
2.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;}
3.js代码
1 function Drag(){} 2 Drag.prototype={ 3 constructor:Drag, 4 init:function(id){ 5 this.ele=document.getElementById(id); 6 var that=this; 7 this.ele.onmousedown=function(e){ 8 var e=event||window.event; 9 that.disX=e.offsetX; 10 that.disY=e.offsetY; 11 document.onmousemove=function(e){ 12 var e=event||window.event; 13 that.move(e); 14 that.ele.onmouseup=function(){ 15 document.onmousemove=null; 16 } 17 } 18 } 19 }, 20 move:function(e){ 21 this.ele.style.left=e.clientX-this.disX+"px"; 22 this.ele.style.top=e.clientY-this.disY+"px"; 23 } 24 } 25 26 new Drag().init("drag1"); 27 28 function ExtendDrag(){}; 29 ExtendDrag.prototype=new Drag(); 30 new ExtendDrag().init("drag2")
三、class继承
html,css与上面一致
js代码:
1 class Drag{ 2 constructor(id){ 3 this.ele=document.getElementById(id); 4 this.init(); 5 }; 6 init(){ 7 var that=this; 8 this.ele.onmousedown=function(e){ 9 var e=event||window.event; 10 that.disX=e.offsetX; 11 that.disY=e.offsetY; 12 document.onmousemove=function(e){ 13 var e=event||window.event; 14 that.move(e); 15 } 16 that.ele.onmouseup=function(){ 17 document.onmousemove=null; 18 that.ele.onmouseup=null; 19 } 20 } 21 }; 22 move(e){ 23 this.ele.style.left=e.clientX-this.disX+"px"; 24 this.ele.style.top=e.clientY-this.disY+"px"; 25 } 26 } 27 28 new Drag("drag1"); 29 30 class ExtendsDrag extends Drag{ 31 constructor(id){ 32 super(id); 33 } 34 } 35 36 new ExtendsDrag("drag2")