js面向对象以及this问题

面向对象

一、封装

<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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,376评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 刚开始使用吸引力法则时,我小心翼翼地告诉自己:『要美梦成真,心须给吸引力法则一些时间去运作。』後来,我发现我错了,...
    指尖传奇阅读 256评论 0 0
  • 风凛寒月百花惧, 枯藤枝下水袖返。 红梅尽落燃冬雪, 美人阡陌百里香。
    盛锦阅读 175评论 0 0
  • 这次只有部分用铅笔描了,感觉圆画得还是不好,云画得也不好。熟悉了各种短线条的绘画,却也都画得不好。
    我是小鱼干呀阅读 374评论 1 1