JavaScript类和继承

ES5之前:
function Person(){
     this.name = 'mia';
}
Person.prototype.showName = function(){}

ES6中的类:
class Person{
        constructor(name){
                this.name = name;
        }
        showName(){
        }
}
------------------------
或者    const Person = class{}  //不推荐
------------------------

let a = 'strive';
let b = 'method';
class Person{
      [a+b](){}
}
let p1 = new Person();
p1[a+b];
let json = {
     [a+b]:'welcome';
}

注意:
1.ES6中class没有提升功能,在ES5中用函数模拟可以,默认函数提升
2.ES6里面的this比之前轻松多了

class里面取值函数(getter),存值函数(setter)

静态方法:类身上的方法
static  fnName(){}
父类.fnName()

继承:ES6中非常简单:(ES6之前继承实现方式可参考文末)
class Student extends Person{
      constructor(name,skill){
              super(name);   //一定要继承父类的构造函数
              this.skill = skill;
      }
      showName(){
               super.showName();//父类的方法执行
               //TODO做子类自己的事情
      }
}

例子:

类-拖拽

.box{

position:absolute;

            width:100px;

            height:100px;

            background-color:red;

            top:100px;

        }

.left{

left:100px;

        }

.right{

right:100px;

        }

div1

div2

//普通拖拽--父类

    class Drag{

constructor(id){

this.oDiv = document.querySelector(id);

            this.disX = 0;

            this.disY = 0;

            this.init();

        }

init(){

this.oDiv.onmousedown = function (ev) {

this.disX = ev.clientX - this.oDiv.offsetLeft;

                this.disY = ev.clientY - this.oDiv.offsetTop;

                document.onmousemove = this.fnMove.bind(this);

                document.oumouseup = this.fnUp.bind(this);

                return false;

            }.bind(this)

}

fnMove(ev){

this.oDiv.style.left = ev.clientX - this.disX + 'px';

          this.oDiv.style.top = ev.clientY - this.disY + 'px';

      }

fnUp(ev){

document.onmousemove = null;

          document.omouseup = null;

      }

}

//子类 --限制范围

    class LimtDrag extends Drag{

fnMove(ev){

super.fnMove(ev)

//限制范围

            if(this.oDiv.offsetLeft<=0){

this.oDiv.style.left = 0;

            }

}

}

//调用

    new Drag('#div1')

new LimtDrag('#div2')



ES6之前企业级继承方式实现:
var inherit = (function(){
          var Buffer = function();
          return function(Target, Origin){
                     Buffer.prototype = Origin.prototype;
                     Target.prototype = new Buffer()
;
                   Target.prototype.constructor = Target;  //还原构造器
                 Target.prototype.super_class = Origin;    //设置继承源      
}    

})();

作者:亦世

链接:https://juejin.im/post/5b724336f265da27d96ef21c

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(JavaScript类和继承)