• 对象继承


    一、拷贝继承

    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.onmousedown=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.onmousemove=function(ev){
            var ev=ev||window.event;  
            This.fnMove(ev);
        };
        document.onmouseup=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.onmousemove=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);
    

      

      

     

      

  • 相关阅读:
    图论03—随意两点间最短距离及路径(改进)
    &lt;转&gt;Openstack ceilometer 宿主机监控模块扩展
    【从零学习openCV】IOS7下的openCV开发起步(Xcode5.1.1&amp;openCV2.49)
    零基础学python-6.2 共享引用
    hdu 2191 悼念512汶川大地震遇难同胞——珍惜如今,感恩生活
    Android与设计模式——单例(Singleton)模式
    SpringMVC+Jquery -页面异步载入数据
    hdoj Let the Balloon Rise
    openStack使用宿主机监控
    winscp自动执行脚本
  • 原文地址:https://www.cnblogs.com/yangxue72/p/8404431.html
Copyright © 2020-2023  润新知