严格模式(代码规范)
严格模式主要有以下限制。
- 变量必须声明后再使用
- 函数的参数不能有同名属性,否则报错
- 不能使用`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();//继承方法
}
}