ES6面向对象

1、ES6面向对象:

  • class(类) 构造函数
  • 对象 实例对象
  • ES5面向对象是模拟面向对象。
    抽象:          具体:
    人类            张三
    动物类          熊猫
    鸟类            黄鹂
    植物类          仙人球
    哺乳动物         人

2、继承

  • 类使用extends关键字实现类的继承
class child extends father{
    
} 
  • 子类也必须具有一个constructor的构造函数,如果没有,那么继承父类的,如果有那么使用自己的,子类的构造函数里面必须调用父类的构造函数,也就是必须要运行super()函数。
  • 其他的地方或者方法中想要调用父类的其他方法,则使用 super.函数名 的方法来实现,super表示父类。
  • bind(), call ,apply 都可以偏正一个函数内部的this。
    eg:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>

</body>
<script>
    function A(name,age){
        this.name = name;
        this.age = 19;
    }
    A.prototype.showName = function(){
        return `我的名字是:${this.name}`;
    };
    A.prototype.showAge = function(){
        // 字符串模板 ${}插入变量
        return `我的年龄是:${this.age}`;
    };
    function B(name,age,use){
        A.apply(this,[name,age]);
        this.use = use;
    }
    console.log(B.prototype.constructor);
    /*ƒ B(name,age,use){
        A.apply(this,[name,age]);
        this.use = use;
    }*/
    B.prototype = new A('','');
    console.log(B.prototype.constructor);
    /*
    ƒ A(name,age){
        this.name = name;
        this.age = 19;
    }
     */
    let b = new B('zhangsan','lisi','nouse');
    console.log(b.showName());
    console.log(b.showAge());
    /*
    我的名字是:zhangsan
    我的年龄是:19
     */
</script>
</html>

3、多继承

eg:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>

</body>
<script>
    function A(name,age){
        this.name = name;
        this.age = 19;
    }
    A.prototype.showName = function(){
        console.log(`我的名字是:${this.name}`);
    };
    A.prototype.showAge = function(){
        console.log(`我的年龄是:${this.age}`);
    };
    function B(sex){
        this.sex = sex;
    }
    B.prototype.showSex = function(){
        console.log(`我的性别是:${this.sex}`);
    };
    function C(use){
        this.use = use;
    }
    //封装多继承
    C.prototype.extends = function(obj,...data){
        obj.apply(this,[...data]); //对象 属性值
        // 合并多个javascript对象
        Object.assign(C.prototype,obj.prototype);
        C.prototype.constructor = C;
    };
    let c = new C('nouse');
    c.extends(A,'lisi','19');
    c.extends(B,'felame');
    console.log(c.showName());
    console.log(c.showSex());
/*
    未封装多继承写法
    C.prototype = Object.create(A.prototype);
    Object.assign(C.prototype,B.prototype);
    C.prototype.constructor = C;
    let c = new C('lisi','19','felame','nouse');
    console.log(c.showName());
    console.log(c.showSex());
*/
</script>
</html>

4、单个方法的继承

eg:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<script>
    function F(){

    }
    F.prototype.h = function(){
        console.log('h');
    }
    F.prototype.m = function(){
        console.log('m');
    }
    function L(){

    }
    L.prototype.m = function(){
        F.prototype.m.call(this);
    }
    let l = new L();
    l.m();
</script>
</body>
</html>

5、constructor: 类的构造函数,类在实例化的时候自动调用,参数自动传递。

  • class的属性名可以是变量,但是这个变量需要使用[]包装起来,表示变量的解析。
  • class的内在本质还是一个function。
    eg:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>

</body>
<script>
    const a = Symbol();
    class Person{
        constructor(name,age){ //构造函数 new的时候自动调用,用于初始化,自动传参
            this.name = name;
            this.age = age;
        }
        // 不能有逗号
        showName(){
            console.log(`我的名字是:${this.name}`);
        }
        showAge(){
            console.log(`我的年龄是:${this.age}`);
        }
        [a](){
            console.log(`我是Symbol数据类型的函数名`);
        }
    }
    let b = new Person('lisi','19');
    b.showName();
    b[a]();
    console.log(typeof Person); //function
</script>
</html>

6、对于ES5的构造函数来说,本质上定义的是一个函数,函数和变量一样,具有提升的特性,所以可以在构造函数的申明之前进行实例化。

  • class没有提升,所以在创建类对象的时候一定要保证类是先加载的。
  • constructor构造函数是class必须的,即使没有申明,那么class也会自动的添加一个空的constructor函数。
    eg:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<script>
    let p = new P();
    class P{
        constructor(){
        }
    }
</script>
</body>
</html>

7、class解构

eg:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>

</body>
<script>
    class Person{
        constructor(name){
            this.name = name;
        }
        say(){
            console.log(`我的名字是:${this.name}`);
        }
    }
    let a = new Person('lisi');
    a.say();
    let {say} = a;
    say.bind(a); //将this的对象变为a
</script>
</html>

8、setter与getter 封装class内部成员属性的作用。

  • set 语法定义的函数,外部在调用函数名为属性的属性设置值的时候调用。
  • get 语法定义的函数,外部在获取这个函数名为属性的属性的时候调用。
    eg:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>

</body>
<script>
    const Person = class{
        constructor(name){
            this.name = name;
        }
        set age(value){ //设置这个值的时候自动调用
            console.log('这里调用参数的设置');
            let c = value;
            console.log(c);
        }
        get age(){ //获取这个值的时候自动调用
            console.log('这里调用参数的获取');
        }
    }
    let a = new Person('lisi');
    a.name = 'zhangsan'; //公有属性 可在外部修改
    console.log(a.name); //zhangsan
    console.log(a.age); //get
    a.age = 1111;
    console.log(a.age); //set 1111
</script>
</html>

9、有的时候我们需要不创建对象,直接使用类去执行某些事情,这个时候就可以使用静态方法。

  • static 静态的,不需要实例化对象去调用的方法。
  • 静态方法里面的this指类本身,而不是对象。
  • 静态方法直接使用类名调用,不能使用对象调用。
  • 静态的类: Math
    eg:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>

</body>
<script>
    class M{
        constructor(){

        }
        say(){
            console.log(this); //实例对象
            console.log('111');
        }
        static Q(){
            console.log(this) //class
            console.log('222');
        }
    }
    let a = new M();
    a.say(); //111
    M.Q(); //222
</script>
</html>

10、var proxy = new Proxy(target, handler);

  • target : 要进行代理的对象。
  • handler:代理的规则。
  • property:代理的属性
  • 代理:帮助做一些事情。
    eg:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>

</body>
<script>
    const obj = {
        a: 1,
        b: 'vsv',
        c: 2,
        d: 'vgfv'
    }
    const e = new Proxy(obj,{
        // target 代理的对象 property 代理的属性
        get: function(target,property){
            if (typeof target[property] == 'munber') {
                return target[property];
            }
            return 0;
        }
    });
    console.log(e.d);
</script>
</html>

11、案例:拖拽

  • 拖拽封装
class Drag{
    constructor(id){
        //获取拖拽对象
        this.d = document.getElementById(id);
        //初始化鼠标按下的相对位置
        this.x = 0;
        this.y = 0;
    }
    init(){
        this.d.onmousedown = function(ev){
            var ev = ev || event;
            //位置
            this.x = ev.clientX - this.d.offsetLeft;
            this.y = ev.clientY - this.d.offsetTop;
            //鼠标移动
            document.onmousemove = this.move.bind(this);
            document.onmouseup = this.up;
            return false;
        }.bind(this);
    }
    move(ev){
        var ev = ev || event;
        this.left = ev.clientX -this.x;
        this.top = ev.clientY - this.y;
        this.d.style.top = this.top + 'px';
        this.d.style.left = this.left + 'px';
    }
    up(){
        document.onmousemove = null;
        document.onmouseup = null;
    }
}
  • 拖拽边界值
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        div{
            width: 200px;
            height: 200px;
            position: absolute;
        }
        #d1{
            background-color: red;
            left: 0;
        }
        #d2{
            background-color: blue;
            right: 0;
        }
    </style>
</head>
<body>
    <div id="d1">vdfv</div>
    <div id="d2">cvad</div>
</body>
<script src="Drag.js"></script>
<script>
    let drag1 = new Drag('d1');
    drag1.init();
    let LimitDrag = class LimitDrag extends Drag{
        move(ev){
            let left = ev.clientX - this.x;
            let top = ev.clientY - this.y;
            if (left < 0) {
                left = 0;
            }else if (left >= window.innerWidth - this.d.offsetWidth) {
                left = window.innerWidth - this.d.offsetWidth;
            }
            if (top < 0) {
                top = 0;
            }else if (top >= window.innerHeight - this.d.offsetHeight) {
                top = window.innerHeight - this.d.offsetHeight;
            }
            this.d.style.left = left + 'px';
            this.d.style.top = top + 'px';
        }
    }
    let drag2 = new LimitDrag('d2');
    drag2.init();
</script>
</html>

12、参考文献链接:http://javascript.ruanyifeng.com/#introduction

http://es6.ruanyifeng.com/

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

推荐阅读更多精彩内容