美文网首页IT学习优秀网站推荐
js面向对象以及this问题

js面向对象以及this问题

作者: Dream_whs | 来源:发表于2016-12-25 19:36 被阅读33次

面向对象

一、封装

<script>
        function person(name,age,hobby){
            this.name='~~'+name;
            this.age=age;
            this.hobby='~~'+hobby;
        }
        person.prototype.showName=function(){
            return this.name;
        };
        person.prototype.showAge=function(){
            return this.age;
        };
        person.prototype.showHobby=function(){
            return this.hobby;
        };
        function worker(name,age,hobby,job){
            //属性继承
            //person(name,age,hobby);
            //问题:
                    //person中的this变成了window
                    //希望把person中的this变成worker对象
            //apply的用法 apply(this(worker),[])  []用arguments代替
            //Person.apply(this,name,age)
            person.apply(this,arguments);
            this.job=job;
        };
        //方法继承
        //(Worker.prototype = Person.prototype;)
        //问题:子类的私有方法,父类也有了
        worker.prototype=new person();
        //问题:w1.constructor     Person
        //直接强制赋值过来...
        worker.prototype.constructor=worker;

        worker.prototype.showJob=function(){
            return this.job;
            alert(1)
        };

        var p1=new person('张三',19,'游泳');
        var w1=new worker('李四',18,'游泳','搬砖');
        alert(p1.showName()+','+p1.showAge()+','+p1.showHobby());
        alert(w1.showName()+','+w1.showAge()+','+p1.showHobby()+','+w1.showJob());
</script>
总结
        属性继承
            子类的构造函数中
                父类.call(this,arg1,arg2...);
                或者
                父类.apply(this,[arg1,arg2...]);
                或者
                父类.apply(this,arguments);
        方法继承
            子类.prototype = new 父类();
            子类.prototype.constructor = 子类;

二、继承

1.选项卡

//直接写方法;
        function Tab(id){
            this.oBox=document.getElementById(id);
            this.aBtn=this.oBox.getElementsByTagName('input');
            this.aDiv=this.oBox.getElementsByTagName('div');

            var iNow=0;
            this.init();//引用方法
        }
        Tab.prototype.init=function(){
            var _this=this;
            for(var i=0; i<this.aBtn.length; i++){
                this.aBtn[i].index=i;
                this.aBtn[i].onclick=function(){
                    //这里的_this只是把变量iNow变成属性
                    //后面的this才是真的代表当前的this(aBtn[i])
                    _this.iNow=this.index;
                    _this.tab();//引用方法
                }
            }
        };
        Tab.prototype.tab=function(){
            for(var i=0; i<this.aBtn.length; i++){
                this.aBtn[i].className='';
                this.aDiv[i].style.display='none';
            }
            this.aBtn[this.iNow].className='active';
            this.aDiv[this.iNow].style.display='block';
        };
        window.onload=function(){
            new Tab('box');
        };

2.拖拽

      <style>
        *{margin:0; padding:0;}
        #box{
            width:200px;
            height:200px;
            background:red;
            position:absolute;
            left:0;
            top:0;
        }
    </style>
    <script>
        function Drag(id){
            this.oBox=document.getElementById(id);
            this.disX=0;//初始值 写法规范而已(可有可无)
            this.disY=0;//初始值 写法规范而已(可有可无)
            this.init();//面向对象方法
        }
        //init方法基本类似于接口,引用了fnDown;
        Drag.prototype.init=function(){
            var _this=this;//存一个this供下面使用
            this.oBox.onmousedown=function(ev){
                var oEvent=ev || event;
                //这里不能直接用this
                _this.fnDown(oEvent);//面向对象方法
                return false;
            }
        };
        /*Down里面才是主要内容,所以代码主体构架在Down里面,
        方法也是在Down里面引用*/
        Drag.prototype.fnDown=function(ev){
            var _this=this;
            this.disX=ev.clientX-this.oBox.offsetLeft;
            this.disY=ev.clientY-this.oBox.offsetTop;
            /*onmousemove和onmuseup 本来就是在down里面的,所以即使是
            面向对象写法,也一定要写在down里面,方法可以提到外面。*/
            document.onmousemove=function(ev){
                var oEvent=ev || event;
                _this.fnMove(oEvent);//面向对象方法
            };

            document.onmouseup=function(){
                _this.fnUp();//面向对象方法
            }
        };
        Drag.prototype.fnMove=function(ev){

            this.oBox.style.left=ev.clientX-this.disX+'px';
            this.oBox.style.top=ev.clientY-this.disY+'px';
        };
        Drag.prototype.fnUp=function(){

            document.onmousemove=null;
            document.onmouseup=null;
        };
        window.onload=function(){
            var n=new Drag('box');
        };

    </script>

this的一些问题

this具体是什么?不看定义,看调用。
1.优先级

         
        高
            new             object
            定时器             window
            事件 /方法      事件/方法所属于的对象(事件和方法都是一类,可以算平级)
            正常调用        window||undefined
        低
<script>
        function show(){
            alert(this);
        }
        var arr = new Array(1,2,3);
        arr.show = show;
        //show();                           //window
        //arr.show();                       //array
        //new show();                       //object
        //new arr.show();                   //object
        //document.onclick = show;
        //document.onclick();               //document
        document.onclick = arr.show;
        //arr.show = document.onclick;
        //arr.show();
        //new document.onclick();           //object
        //document.onclick();               //document
        //setTimeout(show,1);               //window
        //setTimeout(arr.show,1);           //window
        setTimeout(document.onclick,1);

    </script>
2.只管一层
function show(){
            alert(this);
        }
        var arr = [1,2,3];
        arr.show = show;
        //setTimeout(arr.show,1);
        setTimeout(function(){
            //alert(this);
            //new arr.show();
            arr.show();
        },1);       /*按上面的优先级应是window,现在套了一层就变成字符串了,
                    这例子可以看出,this只管一层。*/
        
        //document.onclick=show;              //document
        /*document.onclick = function(){
            //alert(this);
            //arr.show();
            show();
        };                                  //window
        document.onclick();                 //window*/
        //现象同上,this只管一层
3.只看最后一层
<script>
        function show(){
            alert(this);
        }
        var arr = [1,2,3];
        arr.show = show;
        document.onclick = function(){
            setTimeout(function(){
                new b();
            },1);
        };
        function b(){
            new show();
        }           //弹出Object,这个例子看出this只看最后一层
    </script>

三、最后在来说说一些小玩意

1.原型链

<script>
        //Object.prototype.a = 12;      //弹12(其它注释掉)
        //Array.prototype.a = 5;          //弹5(其它注释掉)
        var arr = new Array(1,2);
        arr.a = 3;                      //弹3(其它注释掉)
                                        //都不注释也弹3(因为先在对象身上找)
        alert(arr.a);
        /*原型链   先在对象身上找,如果找不到,找构造函数,构造函数找不到找父类
        ,一直往上找,直到找到Object。   如果都没找到就返回一个undefined*/
</script>

2.找一个值在数组中的位置

Array.prototype.indexOf=function(item){
            //存变量是为了提高性能
            var len=this.length;//this就是他自己
            for(var i=0; i<len; i++){
                if(this[i]==item){
                    return i;
                }
            }
            return -1;
        };

        var arr=[1,2,3,4,5,6,7,8,9,10,11,12,13];
        document.write(arr.indexOf('9'));     //弹8

3.去空格

<script>
        String.prototype.trim = function(){
            //正则去空格
            return this.replace(/^\s+|\s+$/g,'');
        };
        var str = '                呵呵                ';
        alert('|'+str.trim()+'|');

    </script>

4.获取当天星期

<script>
        /*Date.prototype.getCnDay = function(){
            return '星期'+('日一二三四五六').charAt(this.getDay());
        };
        var oDate = new Date();
        document.write(oDate.getCnDay());*/

        /*----------------第二种办法-----------------*/
        Date.prototype.getCnDay = function(){
            var arr = ['日','一','二','三','四','五','六'];
            return '星期'+arr[this.getDay()];
        };
        var oDate = new Date();
        document.write(oDate.getCnDay());
    </script>

相关文章

  • js面向对象以及this问题

    面向对象 一、封装 二、继承 1.选项卡 2.拖拽 this的一些问题 this具体是什么?不看定义,看调用。 1...

  • JS面向对象精要(二)_函数

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(三)_理解对象

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(四)_构造函数和原型对象

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(五)_继承

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS汇总---面向对象&数组

    面向对象 js原型链的继承 静态属性怎么继承 js原型链以及特点 面向对象有哪几个特点 封装,继承,多态 对象的继...

  • 理解js面向对象之继承

    先前整理过js作用域和this关键字的用法,以及分析过js面向对象各种方式,这些都是实现js面向对象所必须的。忘记...

  • TypeScript--3.类

    在ES6之前,JS没有class关键字,JS的面向对象和继承也是面试中常见的问题.之前接触过PHP面向对象的话,在...

  • js 面向对象和面向过程

    js 面向对象和面向过程

  • js中的继承(es5)

    这个问题事关js里面的很多难点的问题,诸如prototype,call和apply等,也是js面向对象的问题,值得...

网友评论

    本文标题:js面向对象以及this问题

    本文链接:https://www.haomeiwen.com/subject/nrmlvttx.html