ES6学习过程

本文详细介绍了JavaScript中的ES6特性,包括类和对象的定义、创建、继承以及构造函数和原型的相关知识。还探讨了ES5中的新增方法,如数组的forEach、filter等,以及函数的this、严格模式、高阶函数、闭包、递归等概念。此外,文章还涵盖了正则表达式和ES6的新增语法,如let、const、解构赋值、箭头函数等。
摘要由CSDN通过智能技术生成

目录

1.学习视频

2.面向过程与面向对象

3.ES6中的类和对象

3.1类和对象的定义

3.2 创建类和生成实例 

3.3类中添加方法

3.4 类的继承

3.5 类的注意事项

3.6 面向对象案例的知识点

3.7 双击编辑

4.构造函数和原型

4.1 概述

4.2 实例成员和静态成员

 4.3 原型

 4.4 对象原型 --proto--

 4.5 constructor 构造函数

4.6 构造函数、实例、原型对象三者之间的关系

 4.7原型链

4.8 原型对象中this的指向

4.9扩展内置对象方法

 5.继承

5.1 call()

5.2 利用父构造函数继承属性

 5.3 利用原型对象继承方法

 5.4 类的本质

 6.ES5中的新增方法

6.1数组方法

6.1.1forEach 迭代(遍历)数组

6.1.2 filter()

6.1.3 some()

6.1.4 map()和every()

6.2字符串方法

6.2.1 trim()

6.3 对象方法

6.3.1 Object.keys遍历对象属性

6.3.2 Object.defineProperty()

 7.函数进阶

 7.1 函数的定义方式

 7.2 函数的调用

 7.3 this

7.3.1 函数内this的指向

7.3.2 改变函数内this指向call方法

 7.3.3 改变函数内this指向apply方法

7.3.4 改变函数内this指向bind方法

 7.3.5 call apply bind总结

 8 严格模式

8.1开启严格模式

 8.2 严格模式的改变

9 高阶函数

10 闭包

10.1 闭包的应用

10.1.1 点击li输出当前li的索引号

10.1.2 定时器中的闭包

 10.1.3 打车价格

 11 递归

11.1 利用递归函数求1~n的阶乘

 11.2 递归函数求斐波那契数列

 11.3 输入id号,就返回对应的数据对象

  11.4 浅拷贝和深拷贝

 12 正则表达式

12.1 概述及作用

12.2 正则表达式在js中的使用

12.3 正则表达式的特殊字符

12.3.1 边界符

 12.3.2 字符类

 12.3.3 量词符

12.3.4 用户名验证

 12.3.5 括号总结

12.3.6预定义类 

12.3.7 正则表达式的替换

 13 ES6

13.1 ES6简介

 13.2 ES6新增语法

13.2.1 let关键字

13.2.2 经典面试题

 13.2.3 const关键字

13.2.4 var、let、const区别 

 13.2.5 数组解构

13.2.6 对象解构

 13.2.7 箭头函数

13.2.8 剩余参数

 13.2.9 剩余参数与数组解构搭配使用

 13.2.10 扩展运算符

13.2.11 Array.from方法

13.2.12 find()方法

 13.2.13 findIndex()方法

 13.2.14 includes方法

 13.3 ES6中String的扩展方法

 13.3.1 模板字符串

13.3.2 startsWith方法和endsWith方法

 13.3.3 repeat()方法

13.3.4 Set 数据结构

1.学习视频

2019全新javaScript进阶面向对象ES6_哔哩哔哩_bilibili

2.面向过程与面向对象

面向过程:按照过程来解决问题(性能好,但不易于维护)

面向对象:先找出对象,每个对象有各自的功能,再来解决问题(用于多人合作,易于维护,但性能没有面向过程好)

3.ES6中的类和对象

3.1类和对象的定义

3.2 创建类和生成实例 

 // 1. 创建类 class  创建一个 明星类
class Star {
    constructor(uname, age) {
        this.uname = uname;
        this.age = age;
    }
}
// 2. 利用类创建对象 new
var ldh = new Star('刘德华', 18);
var zxy = new Star('张学友', 20);
console.log(ldh);
console.log(zxy);
//(1) 通过class 关键字创建类, 类名我们还是习惯性定义首字母大写
//(2) 类里面有个constructor 函数,可以接受传递过来的参数,同时返回实例对象
//(3) constructor 函数 只要 new 生成实例时,就会自动调用这个函数, 如果我们不写这个函数,类也会自动生成这个函数
//(4) 生成实例 new 不能省略
//(5) 最后注意语法规范, 创建类 类名后面不要加小括号,生成实例 类名后面加小括号, 构造函数不需要加function

3.3类中添加方法

class Star {
    // 类的共有属性放到 constructor 里面
    constructor(uname, age) {
        this.uname = uname;
        this.age = age;
    }
    sing(song) {
        // console.log('我唱歌');
        console.log(this.uname + song);
    }
}

注意:多个函数方法之间不用逗号分隔。

3.4 类的继承

 super关键字:调用父类的构造函数(super(参数))或普通函数(super.方法名())

注意:在子类的constructor函数中, super必须在this之前调用

// super 关键字调用父类普通函数
class Father {
    say() {
        return '我是爸爸';
    }
}
class Son extends Father {
    say() {
        console.log(super.say() + '的儿子');
        // super.say() 就是调用父类中的普通函数 say()
    }
}
var son = new Son();
son.say();

// 父类有加法方法
class Father {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
    sum() {
        console.log(this.x + this.y);
    }
}
// 子类继承父类加法方法 同时 扩展减法方法
class Son extends Father {
    constructor(x, y) {
        // 利用super 调用父类的构造函数
        // super 必须在子类this之前调用
        super(x, y);
        this.x = x;
        this.y = y;
    }
    subtract() {
        console.log(this.x - this.y);
    }
}
var son = new Son(5, 3);
son.subtract();
son.sum();

 继承中的属性或方法查找原则:就近原则(先找子类再找父类)

3.5 类的注意事项

1.ES6没有变量提升,必须先定义类再实例化对象。

2.类中的共有属性和方法一定要加this使用

3.constructor里的this指向实例对象,方法里的this指向方法调用者

4.

 sing后不能加(),不然,不用点击就直接执行sing()方法

5.如何把方法里的this变为实例对象:

方法一:

1.在class外:var that;

2.constructor里: that = this;

3.方法里: 把this换成that

方法二:

1.this还是指向调用者,但增加了this参数。

 2.方法中接收传递的this。

3.6 面向对象案例的知识点

1.创建元素并追加到父元素中

一、普通做法:先creatElement()再innerHTML,最后appendChild(),例子如下:

var tr = document.createElement('tr');

tr.innerHTML = '<td>1</td><td>1</td><td>1</td>';

tbody.appendChild(tr);

二、高级做法:利用element.insertAdjacentHTML(position, text)可以直接把字符串格式元素添加到父元素中

position(位置):

'beforebegin'——元素自身的前面 

'afterbegin'——插入元素内部的第一个子节点之前

'beforeend'——插入元素内部的最后一个子节点之后

'afterend'——元素自身的后面

例子:

// (1) 创建li元素
var li = '<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi"></span></li>';
// (2) 把元素追加到对应的父元素里面
that.ul.insertAdjacentHTML('beforeend', li);

3.7 双击编辑

editTab() {
    var str = this.innerHTML;
    // 双击禁止选定文字
    window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
    // alert(11);
    this.innerHTML = '<input type="text" />';
    var input = this.children[0];
    input.value = str;
    input.select(); // 文本框里面的文字处于选定状态
    // 当我们离开文本框就把文本框里面的值给span 
    input.onblur = function() {
        this.parentNode.innerHTML = this.value;
    };
    // 按下回车也可以把文本框里面的值给span
    input.onkeyup = function(e) {
        if (e.keyCode === 13) {
            // 手动调用表单失去焦点事件  不需要鼠标离开操作
            this.blur();
        }
    }
}

4.构造函数和原型

4.1 概述

1.ES6之前,JS中没有引入类的概念,用构造函数来定义对象和它们的特征。目前浏览器的JavaScript是ES5版本,大多数高版本的浏览器也支持ES6,不过实现了ES6的部分特性和功能。

创建对象的三种方法:

// 1. 利用 new Object() 创建对象
var obj1 = new Object();
// 2. 利用 对象字面量创建对象
var obj2 = {};
// 3. 利用构造函数创建对象
function Star(uname, age) {
    this.uname = uname;
    this.age = age;
    this.sing = function() {
        console.log('我会唱歌');
    }
}

var ldh = new Star('刘德华', 18);
var zxy = new Star('张学友', 19);
console.log(ldh);
ldh.sing();
zxy.sing();

4.2 实例成员和静态成员

实例成员:构造函数内部通过this添加的成员,按上例则uname age sing就为实例成员;且实例成员只能通过实例化的对象来访问,如:ldh.sing()

静态成员:构造函数本身添加的成员,如在构造函数外,编写Star.sex='男',则sex为静态成员;且静态成员只能通过构造函数来访问,如:console.log(Star.sex);

 4.3 原型

前提:原来定义的构造函数,实例化对象中相同的方法都有不同的地址,都给每个实例化对象的公共方法分配内存,所以存在浪费内存的问题。

原型:prototype为原型对象,有共享方法的作用。

用法:Star.prototype.sing = function() {

        console.log('我会唱歌');
}

注意:一般情况下,公共属性定义到构造函数中,公共的方法我们放到原型对象上。

 4.4 对象原型 --proto--

1.每个对象都有属性--proto--指向构造函数prototype原型对象,所以可以使用构造函数prototype的属性和方法。

2.方法查找规则:先在实例对象上找是否有方法,没有再去prototype身上找方法。

3.--proto--是一个非标准属性,实际开发中,不可以使用这个属性。

 4.5 constructor 构造函数

对象原型(--proto--)和构造函数原型对象(prototype)都有一个属性constructor属性,constructor称为构造函数,它指回构造函数本身。

作用:让原型对象重新指向原来的构造函数。

使用场景:以原型对象赋值一个对象的形式修改了原来的原型对象,就必修利用constructor指回原来的构造函数。例子如下:

Star.prototype = {
    // 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数
    constructor: Star,
    sing: function() {
        console.log('我会唱歌');
    },
    movie: function() {
        console.log('我会演电影');
    }
}

4.6 构造函数、实例、原型对象三者之间的关系

 4.7原型链

只要是对象就有__proto__原型,指向原型对象。

 

  JavaScript的成员查找机制:在原型链上查找

执行:就近原则

4.8 原型对象中this的指向

构造函数和原型对象里的this,都指向实例对象

4.9扩展内置对象方法

Array.prototype.sum = function() {
    var sum = 0;
    for (var i = 0; i < this.length; i++) {
        sum += this[i];
    }
    return sum;
};

//下面的方法不可行
// Array.prototype = {
//     sum: function() {
//         var sum = 0;
//         for (var i = 0; i < this.length; i++) {
//             sum += this[i];
//         }
//         return sum;
//     }

// }

 5.继承

ES6之前没有提供extends继承,我们通过构造函数+原型对象模拟实现继承,称为组合继承

5.1 call()

1.调用函数:fun.call()

2.修改函数运行时的this指向:fun.call(thisArg, arg1, arg2, …)

thisArg: 当前调用函数this的指向对象

arg1,arg2:传递的其他参数

5.2 利用父构造函数继承属性

//父构造函数

function Father(uname, age){

            //this 指向父亲构造函数的对象实例

            this.uname = uname;

            this.age = age;

 }

//子构造函数

 function Son(uname, age, score){

            // this 指向儿子构造函数的对象实例

            Father.call(this, uname, age);  //把父构造函数的this换成Son

            this.score = score;

 }

var son = new Son(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值