严格模式、Symbol、class、静态方法、类的继承

194 阅读3分钟

严格模式(代码规范)

严格模式主要有以下限制。
    -   变量必须声明后再使用
    -   函数的参数不能有同名属性,否则报错
    -   不能使用`with`语句
    -   不能对只读属性赋值,否则报错
    -   不能使用前缀 0 表示八进制数,否则报错
    -   不能删除不可删除的属性,否则报错
    -   不能删除变量`delete prop`,会报错,只能删除属性`delete global[prop]`
    -   `eval`不会在它的外层作用域引入变量
    -   `eval``arguments`不能被重新赋值
    -   `arguments`不会自动反映函数参数的变化
    -   不能使用`arguments.callee`
    -   不能使用`arguments.caller`
    -   禁止`this`指向全局对象
    -   不能使用`fn.caller``fn.arguments`获取函数调用的堆栈
    -   增加了保留字(比如`protected``static``interface`)
    

函数:
    在参数中通常情况下默认值都会写在最后一个,如果有默认值length不包含默认值
    参数变量是默认声明的,所以不能用`let``const`再次声明

箭头函数

    箭头函数代替有返回值函数
    // add为方法名称,第一个x为参数,第二个x为返回值
    var add = x=>x;
    var add=(x,y)=>x+y
    var add=(a,b)=>({name:a,age:b})
    
    注意:
        箭头函数没有自己的this指向
        不可以当作构造函数,也就是说,不可以对箭头函数使用`new`命令,用构造函数封装的
        不可以使用`arguments`对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
        不可以使用`yield`命令,因此箭头函数不能用作 Generator 函数。
    用法:
        经常用在遍历的函数
        
嵌套的箭头函数替换的是闭包函数 
    // 嵌套箭头函数,遍历数组
    let news=['lily','tom','lucy']
    names.forEach(v=>console.log(v))

Symbol

类似于对象类型
属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突
Symbol 值通过`Symbol()`函数生成,不可以使用new

let s=Symbol("abc")
console.log(s);
typeof s;

class

语法: class 类名(首字母大写)

实例对象的传统方法是通过构造函数
constructor中写成员变量和成员方法
constructor中的this指向new的对象
注意事项:
    严格模式:类和模块的内部,默认就是严格模式,所以不需要使用`use strict`指定运行模式
    
    不存在提升:类不存在变量提升
    
    name 属性:`name`属性总是返回紧跟在`class`关键字后面的类名
    
    Generator 方法:如果某个方法之前加上星号(`*`),就表示该方法是一个 Generator 函数,Generator 函数。
`Symbol.iterator`方法返回一个`Foo`类的默认遍历器,`for...of`循环会自动调用这个遍历器。

    this 的指向:箭头函数内部的`this`总是指向定义时所在的对象
// es5
function Car(color, door){
  this.color = color;
    this.door = door;  
}
Credential.prototype.showMsg = function(){
    console.log(this.color);
    console.log(this.door);
}
// es6 
class Car{
    constructor(color, door){
        this.color = color;
        this.door = door;
    }
    showMsg(){
        console.log(this.color);
        console.log(this.door);
    }
}
//es6调用
let c1=new Car("red",4);
C1.showMsg();

静态方法

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上`static`关键字,就表示该
方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

静态方法不被继承

类的继承

Class 可以通过`extends`关键字实现继承,让子类继承父类的属性和方法
关键字
    `super`这个关键字,既可以当作函数使用,也可以当作对象使用
    `super`作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次`super`函数。
    'super'作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类
//类的继承(固定写法)
class NewCar extends Car{
    constructor(){
        super();//继承方法
    }
}