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

面向对象拥有属性和方法,构造函数在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中变形:

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

推荐阅读更多精彩内容

  • 基本语法 简介 JavaScript语言中,生成实例对象的传统方法是通过构造函数. ES6提供更接近传统语言的写法...
    JarvanZ阅读 879评论 0 0
  • 继承6种套餐 参照红皮书,JS继承一共6种 1.原型链继承 核心思想:子类的原型指向父类的一个实例 Son.pro...
    灯不梨喵阅读 3,140评论 1 2
  • class的基本用法 概述 JavaScript语言的传统方法是通过构造函数,定义并生成新对象。下面是一个例子: ...
    呼呼哥阅读 4,092评论 3 11
  • 简介 Class可以通过extends关键字实现继承。 上面代码定义了一个ColorPoint类,该类通过exte...
    oWSQo阅读 668评论 0 1
  • 对于子女的婚事,几乎每个父母对自己的儿媳和女婿的标准都是没有标准,只要对我儿子(女儿)好,只要儿子(女儿)喜欢就行...
    现在的孩子真是阅读 458评论 1 0