1.箭头函数中的this指向定义时当前周围的作用域;
2.如果使用标记模板字面量,第一个参数的值总是字符串的数组。其余的参数获取的是传递的表达式的值;
3. es6中和原型一样用来继承的class和继承是怎么实现的?
贴上
class Point {
// ...
}
typeof Point // "function",类的数据类型就是函数
Point === Point.prototype.constructor // true,类本身就指向构造函数
使用的时候,也是直接对类使用new
命令,跟构造函数的用法完全一致,不使用new会报错。
类的所有方法都定义在类的prototype
属性上面。
class Point {
constructor() { // ... }
toString() { // ... }
toValue() { // ... }
}
// 等同于
Point.prototype = {
constructor() {},
toString() {},
toValue() {},
};
//Object.assign方法可以很方便地一次向类添加多个方法
Object.assign(Point.prototype, {
toString(){},
toValue(){}
});
类不存在变量提升(hoist),这一点与 ES5 完全不同。
Class 可以通过extends
关键字实现继承。
class ColorPoint extends Point {}//ColorPoint继承了Point类所有的属性和方法
super
关键字,表示父类的构造函数,用来新建父类的this
对象。
子类必须在constructor
方法中调用super
方法,否则新建实例时会报错,只有调用super
之后,才可以使用this
关键字。
区别:
ES5 的继承,实质是先创造子类的实例对象this
,然后再将父类的方法添加到this
上面(Parent.apply(this)
)。
ES6 的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到this
上面(所以必须先调用super
方法),然后再用子类的构造函数修改this
。
Class 作为构造函数的语法糖,同时有prototype
属性和__proto__
属性,因此同时存在两条继承链。
(1)子类的_proto_
属性,表示构造函数的继承,总是指向父类。
(2)子类prototype
属性的_proto_
属性,表示方法的继承,总是指向父类的prototype
属性。
子类实例的__proto__
属性的__proto__
属性,指向父类实例的__proto__
属性。也就是说,子类的原型的原型,是父类的原型。
Object.getPrototypeOf
方法判断,一个类是否继承了另一个类。
4. es6中const、let、var之间的区别?
-
var定义的变量,作用域是整个封闭函数,是全域的;
let定义的变量,作用域是在块级或者字块中;
-
变量提升:不论通过var声明的变量处于当前作用于的第几行,都会提升到作用域的最顶部。
而let声明的变量不会在顶部初始化,凡是在let声明之前使用该变量都会报错(引用错误ReferenceError);
-
只要块级作用域内存在
let