初试面向对象编程

面向对象编程

面向历程

  • javascript是一门面向历程的言语,也就是侧重点是完成一件事的步骤。
  • 特性:有优越的可扩展性和重用性,降低了代码间的耦合度,靠近一样平常头脑。

面向对象

  • 以事物为中间,侧重于完成某件事所须要的事物的特性和行动的设想。
  • 特性:封装、继续、多态,耦合度低,复费用好。

置信这些概念性的东西,网上真的是一搜一大堆,在我运用我的要领明白和上手面向对象之前,允许我把概念性的东西写完,毕竟基本迥殊主要啊。置信我,假如你正在浏览,请忍受一两分钟

相干名词

  • prototype : 猎取组织函数的原型对象
  • constructor : 猎取原型对象的组织函数
  • –proto– : 猎取实例对象的组织函数的原型对象
  • 原型链 : 组织函数自身会有原型对象,经由过程prototype检察,组织函数的实例对象自身也会有原型对象,经由过程–proto–检察,–proto–是object范例,当接见一个实例化的属性时,浏览器会先查找自身内部属性,没有就找–proto–,直到–proto–范例为null。
  • New关键字作用:建立一个空对象,让空对象挪用组织函数给自身赋值,将该对象返回

继续

完成B继续A

  1. 体式格局一:在B的组织函数内部写A.call(this);瑕玷:参数设置不天真
  2. 体式格局二:(运用原型链完成继续)step1:转变自身原型对象B.prototype=new A();step2:修复原型对象指向的组织函数B.prototype.constructor=B

好啦,概念性的东西就写到这,下面最先我的代码之旅,如今已晚上11:30整,我好打盹儿啊,太困了,把这个写完我就去睡觉了Zzzz

基本设置

国际惯例,先把代码的基本设置好

            div,
            p {
                width: 100px;
                height: 30px;
                border: 1px solid #ddd;
                margin: 30px auto;
            }
            div.open,p.open{
                background: pink;
            }


            <body>
                <div></div>
                <div></div>
                <p></p>
                <p></p>
            </body>

1.基本版

        /*NO.1
         * 基本要领
         * 瑕玷:代码冗余,反复猎取元素反复轮回操纵
         * 功用:修正背景色
         */

        var divs1 = document.getElementsByTagName("div");
        var ps1 = document.getElementsByTagName("p");
        for (var i = 0; i < divs1.length; i++) {
            divs1[i].style.backgroundColor = "pink";
        }
        for (var i = 0; i < ps1.length; i++) {
            ps1[i].style.backgroundColor = "pink";
        }

2.进阶版(一)

        /*NO.2
         * 进阶要领
         * 瑕玷:太范围,只能设置款式
         * 功用:修正背景色
         */
        function getDOM(tagName){
            return document.getElementsByTagName(tagName);
        }
        function setStyle(arr,styleName,styleVal){
            for (var i = 0; i < arr.length; i++) {
                arr[i].style[styleName] = styleVal;
            }
        }
        var divs2 = getDOM("div");
        var ps2 = getDOM("p");
        setStyle(divs2,"backgroundColor","#00a09d");
        setStyle(ps2,"backgroundColor","#00a09d");

3.进阶版(二)

        /*NO.3
         * 进阶要领
         * 瑕玷:代码不利于浏览,没有结构化
         * 功用:修正宽度,添补笔墨,遍历封装
         */
        function getDOM(tagName){
            return document.getElementsByTagName(tagName);
        }
        function each(arr,callback){
            for (var i = 0; i < arr.length; i++) {
                callback(arr[i])
            }
        }
        var divs2 = getDOM("div");
        var ps2 = getDOM("p");
        each(divs2,function(tag){    
            tag.style.width = "200px";
            tag.innerText = "I have a pen!!!";
        })

4.进阶版(三)

        /*NO.4
         * 进阶要领,传统面向对象写法(自力作用域)
         * 功用:增加款式,遍历封装
         */
        function Tool(bgColor){
            this.bgColor = bgColor||"#00a09d";
            this.getDom = function(tagName){
                return document.getElementsByTagName(tagName);
            };
            this.each = function(arr,callback){
                for (var i = 0; i < arr.length; i++) {
                    arr[i].style.backgroundColor = this.bgColor;
                    callback(arr[i]);
                }
            };
        }
        //实例化(运用)
        var tool = new Tool();
        var ps3 = tool.getDom("p");
        var divs3 = tool.getDom("div");
        tool.each(divs3,function(tag){    
            tag.style.width = "200px";
            tag.innerText = "I have a pen!!!";
        })

5.终极版

        /*NO.5
         * 进阶要领,ES6面向对象写法(自力作用域,类自身指向组织函数)
         * 功用:将传入的对象变成赤色,添补笔墨,增加点击结果(歪楼了,需求改成这怂模样了)
         * 申明:实例化以后马上完成以上功用
         * 功用:修正背景,添补笔墨,绑定事宜......
         */
        class Tool{
            //组织函数(options为实例化传入的参数)
            //作用:设置默许参数,兼并默许参数和传入的参数,完成继续
            constructor(options){
                let dafultOpations = {
                    element:"",
                    bgColor:"red",
                    color:"#fff"
                }
                
                this.options = Object.assign({},dafultOpations,options); //兼并对象   assign(相同项会掩盖) merge(相同项会兼并)
                this.checkOptions().setStyle().setText().bindClick()  //实例化后马上实行这些要领,每一个要领在挪用完成后一定要开释this
            }
            //因为该类的完成依赖于传入的DOM,此要领用来确保已传入DOM,若实例化没有传入,则抛出非常
            checkOptions(){
                if(!this.options.element){
                    throw new Error("Element is required!!!")
                }
                return this;
            }
            setStyle(){
                for (var i = 0; i < this.options.element.length; i++) {
                    this.options.element[i].style.backgroundColor = this.options.bgColor;
                    this.options.element[i].style.textAlign = "center";
                    this.options.element[i].style.color = this.options.color;
                }
                return this;
            }
            setText(){
                for (var i = 0; i < this.options.element.length; i++) {
                    this.options.element[i].innerText = "呆呆Akuma";
                }
                return this;
            }
            bindClick(){
                for (var i = 0; i < this.options.element.length; i++) {
                    let __this = this.options.element[i];  //需将当前的元素区离开 __this!=this
                    let flag = false;
                    __this.addEventListener("click",()=>{
                        if(flag = !flag){                            
                            __this.style.backgroundColor = "pink"
                        }else{
                            __this.style.backgroundColor =     this.options.bgColor;                    
                        }
                    })
                }
                return this;
            }
        }
        
        
        
        var divs = new Tool({
            element:document.getElementsByTagName("div"),
            bgColor:"#00a09d"
        });
        var ps = new Tool({
            element:document.getElementsByTagName("p"),
            bgColor:"#f48"
        });

现在看起来,这个终极版好像是最烦琐的,起首我要申明,这里只是引见面向对象编程是怎么回事,关于漫天飞的this真的神烦,不过量写写就好了,习气就好,要学会掌握它,假如你胜利看完这篇文章,你就会发明,跟着版本(临时就算版本吧)晋级,功用也逐步增加,天真性更好,代码的可扩展性更高啦,至于质疑一个简朴的功用至于写这么庞杂吗?

很好,我以为面向对象编程就是造轮子的历程,轮子就相当于东西。打个比如,伐树你会挑选电锯照样斧头,劈柴你会挑选电锯照样斧头,置信答案就在你内心,好了不写了,真困了,快睡着了。

    原文作者:miomiomio
    原文地址: https://segmentfault.com/a/1190000014001942
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞