美文网首页ES6
es6-笔记之五:类(class)和继承

es6-笔记之五:类(class)和继承

作者: AizawaSayo | 来源:发表于2019-03-22 09:53 被阅读0次

面向对象拥有属性和方法,构造函数在es5及之前的写法如下:

function Per(name,age){
        this.name=name;
        this.age=age;
        this.showName=function(){
            return `名字为${this.name}`;
    }
}
Per.prototype.showAge=function () {
    return `年龄为${this.age}`;
}
//给对象添加方法等同于以上
Object.assign(Per.prototype,{
    showName1(){
        return `名字为${this.name}`;
    },
    showAge1(){
        return `年龄为${this.age}`;
    }
});
var p1=new Per('囡囡',3);
console.log(p1.showName(),p1.showName1());//结果均为名字为囡囡
console.log(p1.showAge(),p1.showAge1());//结果均为年龄为3

es6中变形:

let aaa='我呀';
const Person=class{
    constructor(name,age){
        //
    }
    showName(){
        //
    }
}
//上述是表达式,不推荐
let aaa='myFun';
let bbb='Hey';
class Person{
    constructor(name,age){
        this.name=name;
        this.age=age;
    }
    showName(){
        return `名字为${this.name}`;
    }
    showAge(){
        return `年龄为${this.age}`;
    }
    [aaa](){//方法名为变量
        return `变量名为${aaa}`
    }
    [aaa+bbb](){
        return `变量名为${aaa}+${bbb}`
    }
}
let p2 =new Person('vivi',18);
console.log(p2[aaa]());//变量名为myFun
console.log(p2[aaa+bbb]());//变量名为myFun+lala
//题外话
let json={
    [aaa+bbb]:'json也可以变量拼接'
}
p2.ddd="lala";

注意点:1.**class没有提升(预解析),而调用函数都是一般都是在任何地方都可以。除了将函数保存为表达式。var fn=function(){}

let p1=new Person();
class Person{
    constructor(){
        this.name="bobo";
    }
}
console.log(p1);////Person is not defined

2.this,用class不必担心this指向混乱,永远指向class所在的对象。
矫正this
(1)fn.call(this指向谁,args1,args2…)
(2)fn.apply(this指向谁,[args1,args2…])
(3)fn.bind()//不管回调的事情,只矫正指向

class Person3{
    constructor(){
        this.name='vivi';
        this.showName=this.showName.bind(this);//矫正this
        }
        showName(){
            return `名字为:${this.name}`;
        }
}
let p4=new Person3();
let {showName}=p4;//硬用解构
console.log(showName());//名字为:vivi

取值函数getter,存值函数setter。除了封装底层框架之外,很少用到。了解即可

class Person{
    constructor(name,age){
    }
    get aaa(){
        return `获取aaa的属性`
    }
    set aaa(val){
        console.log(`设置aaa的属性,值为${val}`);//设置aaa的属性,值为123
    }
}
let p1 =new Person();
p1.aaa="123";
console.log(p1.aaa);//获取aaa的属性

静态方法:类自身的方法,类可以自调用。

class Person {
    showName() {
        return `这是showName方法`
    }

    static showNew() {
        return `这是静态方法`
    }
}
var p1=new Person;
console.log(p1.showName());//这是showName方法
console.log(Person.showNew());//这是静态方法

类的继承:子继承父的属性和方法,es5传统模式如下:

function Person2(name) {
     this.name=name;
     this.showName=function () {
         return `名字是${this.name}`;
     }
}
function Student(name,skill) {
    Person2.call(this,name);//继承属性
    this.skill=skill;
}
Student.prototype=new Person2();//继承方法
//调用
let stu1= new Student('vivi','吃饭');
console.log(stu1.name);//vivi
console.log(stu1.showName());//名字是vivi

es6则方便得多:

class Person3{
    constructor(name){
        this.name=name;
    }
    showName() {
        return `名字是${this.name}`;
    }
}
class Student2 extends Person3{
    constructor(name,skill){
        super(name);//继承属性
        this.skill=skill;
    }
    showName() {
        super.showName();//父类的方法执行
        //TODO做子级的事情
    }
    showSkill(){
        return `哥们的技能为${this.skill}`
    }
}//es6一句代码轻松搞定继承
let stu2= new Student('bro','跳舞');
let stu3=new Student2('bro','跳舞');
console.log(stu2.name);//bro
console.log(stu2.showName());//名字是bro
console.log(stu3.name);//bro
console.log(stu3.showSkill());//哥们的技能为跳舞

拖曳方法继承实例

<style>
    .box{
      width: 100px;
      height: 100px;
      background: rebeccapurple;
      position: absolute;
      top: 0;
      color: white;
      text-align: center;
      line-height: 100px;
      cursor: pointer;
    }
    .left{
      left: 0;
    }
    .right{
      right: 0;
    }
  </style>
</head>
<body>
<div id="div1" class="box left">Div1</div>
<div id="div2" class="box right">Div2</div>
<script>
//普通拖曳,父类
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.onmouseup = this.fnUp.bind(this);
         }.bind(this);
     }
     fnMove(ev){
         this.oDiv.style.left=ev.clientX - this.disX+'px';
         this.oDiv.style.top=ev.clientY - this.disY+'px';
     }
    fnUp(){
        document.onmousemove=null;
        document.onmouseup=null;
    }
}
//子类-限制范围,演示继承
class LimitDrag extends Drag{
    fnMove(ev){
        super.fnMove(ev);
        //限制范围
        if(this.oDiv.offsetLeft<=0){
            this.oDiv.style.left=0;
        }
        if(this.oDiv.offsetTop<=0){
            this.oDiv.style.top=0;
        }
    }
}
//调用
new Drag("#div1");
new LimitDrag("#div2");

相关文章

  • es6-笔记之五:类(class)和继承

    面向对象拥有属性和方法,构造函数在es5及之前的写法如下: es6中变形: 注意点:1.**class没有提升(预...

  • class 类和继承

    1.构造函数 constructor 设置属性 等价于 2.静态方法 等同于 3.继承

  • 2017-9-18学习总结

    今天,是充满希望的一天。 上学学习了继承和派生 笔记内容: class 派生类名:继承方式 基类名 { 派生类中的...

  • 2017.9.18

    继承和派生 派生的格式: class 派生类名:继承方式 基类名 {派生类中的新成员} 例: class Mast...

  • 给深度学习入门者的Python快速教程 - 基础篇 - 笔记

    标签: 读书笔记 python 深度学习 原文链接 1. Class 类的基本声明和成员 类的继承 2. 函数式编...

  • python入门系列:面向对象

    类和对象的创建 类 # 经典类 没有继承 object的类 # 新式类 继承了 object的类 class Mo...

  • python 继承和多态

    来自廖雪峰class(类)可以被继承,新的class称为子类(Subclass),被继承的class是基类、父类或...

  • Scala入门(五)面向对象

    对象 object类 class特质 trait继承样例类 case class模式匹配 类: class关键...

  • class类继承

    简介 Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。...

  • JS中类的继承封装和多态

    子类继承父类的属性和方法(原生继承,call继承,寄生组合继承,ES6中class类继承)原生继承:让子类的原型指...

网友评论

    本文标题:es6-笔记之五:类(class)和继承

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