一、拷贝继承
1.什么是继承
在原有对象的基础上,略作修改,得到一个新的对象
不影响原有对象的功能
子类不影响父类,子类可以继承父类的一些功能(代码复用)
2.如何添加继承
属性:call
方法:for in
(一)属性的继承
//属性的继承:调用父类的构造函数,用call改变this指向
function CreatePerson(name,sex){//父类
this.name=name;
this.sex=sex;
}
CreatePerson.prototype.showName=function(){
alert(this.name);
}
var p1=new CreatePerson('小明','男');
p1.showName();
function CreateStar(name,sex,job){//子类
//继承父类
CreatePerson.call(this,name,sex);
// this.name=name;
// this.sex=sex;
this.job=job;
}
var p2=new CreateStar('黄晓明','男','演员');
(二)方法的继承
//var a={
// name:'小明'
//};
//var b=a;
//b的name属性的修改影响了a的name属性,两者相互影响,解决办法用for in
//for(var attr in a){
// b[attr]=a[attr];
//}
//var b={};
//extend(b,a);
//b.name='小强';
//alert(a.name);
//封装函数
function extend(obj1,obj2){
for (var attr in obj2) {
obj1[attr]=obj2[attr];
}
}
function CreatePerson(name,sex){//父类
this.name=name;
this.sex=sex;
}
CreatePerson.prototype.showName=function(){
alert(this.name);
}
var p1=new CreatePerson('小明','男');
p1.showName();
function CreateStar(name,sex,job){//子类
//继承父类
CreatePerson.call(this,name,sex);
// this.name=name;
// this.sex=sex;
this.job=job;
}
//方法继承:for in 拷贝继承(jquery也是采用拷贝继承)
extend(CreateStar.prototype,CreatePerson.prototype);
var p2=new CreateStar('黄晓明','男','演员');
p2.showName();
(三)继承实例-拖拽
function Drag(id){
this.oDiv=document.getElementById(id);
this.disX=0;
this.disY=0;
}
Drag.prototype.init=function(){
var This=this;
this.oDiv.οnmοusedοwn=function(ev){
var ev=ev||window.event;
This.fnDown(ev);
//清除默认事件
return false;
}
}
Drag.prototype.fnDown=function(ev){
var This=this;
this.disX=ev.clientX-this.oDiv.offsetLeft;
this.disY=ev.clientY-this.oDiv.offsetTop;
//设置全局捕获
//所有的onmousemove或者onmouseup都被oImg截获,然后作用在oImg身上
if(this.oDiv.setCapture){
this.oDiv.setCapture();
}
document.οnmοusemοve=function(ev){
var ev=ev||window.event;
This.fnMove(ev);
};
document.οnmοuseup=function(ev){
var ev=ev||window.event;
This.fnUp(ev);
};
}
Drag.prototype.fnMove=function(ev){
var L=ev.clientX-this.disX;
var T=ev.clientY-this.disY;
this.oDiv.style.left=L+'px';
this.oDiv.style.top=T+'px';
}
Drag.prototype.fnUp=function(){
document.οnmοusemοve=null;
//释放全局捕获
if(this.oDiv.releaseCapture){
this.oDiv.releaseCapture();
}
}
function extend(obj1,obj2){
for (var attr in obj2) {
obj1[attr]=obj2[attr];
}
}
//继承父级的属性
function ChildDrag(id){
Drag.call(this,id);
}
//继承父级的所有方法
extend(ChildDrag.prototype,Drag.prototype);
//子类独有的方法,限制范围
Drag.prototype.fnMove=function(ev){
var L=ev.clientX-this.disX;
var T=ev.clientY-this.disY;
//限制拖拽范围
//横向
if(L<0){
L=0;
}else if(L>document.documentElement.clientWidth-this.oDiv.offsetWidth){
L=document.documentElement.clientWidth-this.oDiv.offsetWidth;
}
//纵向
if(T<0){
T=0;
}else if(T>document.documentElement.clientHeight-this.oDiv.offsetHeight){
T=document.documentElement.clientHeight-this.oDiv.offsetHeight;
}
this.oDiv.style.left=L+'px';
this.oDiv.style.top=T+'px';
}
var dl=new Drag('div1');
dl.init();
var d2=new ChildDrag('div2');
d2.init();
二、其他继承方式
(一)类式继承
/*
继承的其他形式
1.类式继承:利用构造函数(类)继承的方法
2.原型继承:借助原型来实现对象继承对象
* */
//类式继承
//类:JS是没有类的概念的,把JS中的构造函数看作类
//要做属性和方法继承的时候,要分开继承
function Aaa(){//父类
this.name='小明';
}
Aaa.prototype.showName=function(){
alert(this.name);
}
function Bbb(){//子类
}
var F=function(){};
//F只继承Aaa的方法
F.prototype=Aaa.prototype;
Bbb.prototype=new F();
//修正指向问题
Bbb.prototype.constructor=Bbb;
var b1=new Bbb();
b1.name="小花";
b1.showName();
var b2=new Bbb();
b2.name="小豆";
b2.showName();
//alert(b1.name);