js继承的用法
继承
组合继承
组合继承实际就是构造函数继承+原型链继承
function Person(name,age,sex) { this.name=name; this.age=age; this.sex=sex; } Person.prototype.sayHi=function () { console.log("来啦"); }; function Student(name,age,sex,score) { //借用构造函数:属性值重复的问题 Person.call(this,name,age,sex); this.score=score; } //改变原型指向----继承 Student.prototype=new Person();//不传值
Student.prototype.constructor = Student
Student.prototype.eat=function () { console.log("没错"); };
缺点:
由于调用了两次父类,所以产生了两份实例
优点:
函数可以复用
不存在引用属性问题
可以继承属性和方法,并且可以继承原型的属性和方法
寄生组合继承-修复组合继承的不足。
function Person(name,age,sex) { this.name=name; this.age=age; this.sex=sex; } Person.prototype.sayHi=function () { console.log("来啦"); }; function Student(name,age,sex,score) { //借用构造函数:属性值重复的问题 Person.call(this,name,age,sex); this.score=score; } let Link = function(){} Link.prototype = Person.prototype Student.prototype = new Link() Student.prototype.constructor = Student Student.prototype.eat=function () { console.log("没错"); };
es6类的继承
简单易理解
let d1 = document.querySelector(".d1");
let d2 = document.querySelector(".d2");
class Dra{
constructor(ele) {
this.ele = ele
}
downFn(){
this.ele.onmousedown = e=>{
let x,y
let ev = e || window.event;
console.log(ev.clientX,ev.clientY)
x = ev.clientX - this.ele.offsetLeft;
y = ev.clientY - this.ele.offsetTop;
this.moveFn(x,y)
}
}
moveFn(x,y){
this.ele.onmousemove = e=>{
let ev = e || window.event
let xx = e.clientX
let yy = e.clientY
this.setStyle(xx-x,yy-y)
this.upFn()
}
}
setStyle(x,y){
this.ele.style.left = x+"px"
this.ele.style.top = y+"px"
}
upFn(){
this.ele.onmouseup= () =>{
this.ele.onmousemove = ""
}
}
}
let dra = new Dra(d1)
dra.downFn()
let dra2 = new Dra(d2)
dra2.downFn()
class Limit extends Dra{
constructor(ele) {
super(ele)//函数
}
setStyle(x,y){
x = x<0?0:x
y = y<0?0:y
super.setStyle(x,y)//对象
}
}
let limit = new Limit(d2)
limit.downFn()
super(ele)函数
super.xx 对象
类Limit通过extends继承Dra类,constructor中必须调用super(ele)函数,在Limit中可以重写Dra中的方法,而且super对象中可以拿到Dra类的属性和方法。
继承可以很好的扩展一些类的功能。

浙公网安备 33010602011771号