其他分享
首页 > 其他分享> > 小球运动案例重新理解Es6继承和寄生式继承

小球运动案例重新理解Es6继承和寄生式继承

作者:互联网

首先呢,es6的继承是要比es5简单的,所以我们先吧我们之前写过的那个面向对象对象的小球,再重新拿过来 什么是继承呢,就是根据原有的方法和属性,想去创建新的对象的时候,只需要根据已有的对象去new一个新对象出来 new出来的对象具有原有类的方法和属性,不一样的地方我们再去添加他的新的属性和方法,我的理解就是这样的,那我们先来看下效果

 

 这个小方块是根据原来的小球new出来的一个新对象,我们添加了新的属性,取消了他的圆角,通过这个例子我们来理解一下es6的继承

es5中的类和es6中的类的写法也是有区别的,这个在之前的代码中也有写过

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
    <script>
        class Ball {
            constructor( r ) {
                this._r = 25;
                this.ball = null;
                this.bool = false;
                if ( r ) {
                    this.r = r;
                }
            }
            set r( value ) {
                this._r = value;
                if ( !this.ball ) return;
                this.ball.style.width = value * 2 + "px";
                this.ball.style.height = value * 2 + "px";
                this.ball.style.borderRadius = value + "px";
            }
            get r() {
                return this._r;
            }
            createBall( parent ) {
                if ( !this.ball ) {
                    this.ball = document.createElement( "div" );
                    this.ball.style.width = this.r * 2 + "px";
                    this.ball.style.height = this.r * 2 + "px";
                    this.ball.style.borderRadius = this.r + "px";
                    this.ball.style.backgroundColor = "red";
                    this.ball.style.position = "absolute";
                    this.ball.self = this;
                    this.ball.addEventListener( "click", this.clickHandler );
                    parent.appendChild( this.ball );
                }
                return this.ball;
            }
            clickHandler( e ) {
                this.self.bool = !this.self.bool;
            }
            update() {
                if ( !this.bool ) return;
                this.ball.style.left = this.ball.offsetLeft + 2 + "px";
            }
        }

    
        class Box extends Ball {
            constructor( r ) {
                super( r ); //执行超类中constructor(构造函数)
            }
            //  override 覆盖 这里因为重写父类中createBall方法,这样就会将其覆盖
            //  覆盖的目的是重写,父类的那个方法内容不再执行,而执行当前这个子类的这个方法
            createBall( parent ) {
                //  super.方法()就是执行父类的当前这个方法
                //  通常用于我们需要在父类的该方法中加入更多语句,或者修改部分语句
                let div = super.createBall( parent );
                div.style.borderRadius = "0px";
                return div;
            }
            setWH( w, h ) {
                this.ball.style.width = w + "px";
                this.ball.style.height = h + "px";
            }
        }


        let b1 = new Ball( 20 );
        let b2 = new Box( 30 );
        b2.createBall( document.body );
        b1.createBall( document.body );
        b2.setWH( 50, 100 );
        console.log( b2, b1 );
    //动画函数,每帧执行 animation(); function animation() { requestAnimationFrame( animation ); b1.update(); b2.update(); } </script> </body> </html>

那么接下来我再重新整理出我们es5中的继承的,因为其他的继承稍微有点缺陷,这个缺陷可以自行百度,所以我们以后都是用寄生式继承来使用

<script>
        function Ball(user) {
            this.name=user;
            console.log("aaa");
        }
        Ball.prototype={
            a:1,
            b:2,
            c:function () {
                this.a=10;
            }
        };

       function extend(subClass,supClass) {
//           创建一个空类,空的构造函数
            function A() {}
//            设置这个空类的原型是父类的原型,这样保证这个空类和父类一样,但是没有父类构造函数内容
//           这样就解决直接继承时调用两次构造函数的情况
            A.prototype=supClass.prototype;
//            将这个与父类相似的类实例化后赋值给子类的原型,这样子类的原型就是这个空类的实例化对象
//           因此子类的原型里面就有了空类的原型下所有属性和方法
            subClass.prototype=new A();
//            子类的原型指针指向子类的构造函数
            subClass.prototype.constructor=subClass;
//            因为可能在子类使用到父类原型
//           设置子类的属性superClass是父类的原型对象
            subClass.superClass=supClass.prototype;
//            如果父类原型的指针没有指向父类的构造函数,仍然指向的是对象
            if(supClass.prototype.constructor===Object.prototype.constructor){
//                将父类的原型指针指向父类构造函数
                supClass.prototype.constructor=supClass;
            }
       }

       function Box(user) {
           Ball.call(this,user);
       }
        extend(Box,Ball);
        Box.prototype.d=function () {
            
        };
        Box.prototype.e=5;
        Box.prototype.c=function () {
            Box.superClass.c.call(this);
            console.log(this.a);
        };

        /*
        *
        *   ES5
        *   1、先写extend函数
        *   2、新建父类和父类所有原型属性和方法
        *   3、新建子类,并且在子类的构造函数中执行 父类构造函数.call(this,参数1,参数2..)
        *   4、使用extend函数,填入子类和父类,完成继承
        *   5、只能使用子类.prototype.属性/方法=...设置添加新的子类方法和属性
        *           不能使用 子类.prototype={...}这种添加属性方法,这样会覆盖继承的方法
        *   6、覆盖父类的方法,子类.prototype.父类方法=function(){}
        *   7、super父类方法,就是希望在父类的该方法执行后在添加一些新的内容
        *        子类.superClass.父类方法.call(this,参数...);
        *        这句写在子类覆盖父类方法中
        *    8、最后就可以使用new来实例化对象了
        *   
        *  
        * */

        var b1=new Box("xie");
        b1.c();
        console.log(b1);
    </script>

 

标签:Es6,style,ball,继承,子类,小球,prototype,父类,构造函数
来源: https://www.cnblogs.com/0811thomas/p/15876834.html