1.this指向
普通函数:window
自执行函数:this指向上级作用域
构造函数:指向new出来的那个实例化对象
事件:this指向事件源
对象字面量中的方法:指向调用者
2.修改this指向的三种方法
函数.call(this指向,参数1,参数2,...)
函数.apply(this指向,[参数1,参数2,...]) 参数必须在数组里,然后会把数组拆分
函数.bind(this指向,参数1,参数2,...) 需要改变this指向,又不需要立即执行用bind
3.class封装
语法 class 类名 { }
实例成员:属性写的时候不加let,方法写的时候不加function
静态成员:加上static
构造函数:constructor () { }
4.class继承
extends继承:声明一个类是子类
super:如果子类没有自己的属性和方法,不用加super,如果子类有自己的属性和方法,又得继承父类的属性和方法,要加super super(属性,属性) super.方法()
5.浅拷贝
只拷贝最外层的
可以用for in遍历,也可以用Object.assign(空的,有的)
let obj = {
uname : '刘佳慧',
age : 23,
eat : function () {
console.log('吃饭');
},
}
let newObj = {};
Object.assign(newObj, obj);
// for (let key in obj) {
// newObj[key] = obj[key];
// }
obj.uname = '你好';
console.log(obj, newObj);
6.深拷贝
所有层都拷贝,包括里面的层(有数组、对象的)
let obj = {
uname : '刘佳慧',
age : 23,
eat : function () {
console.log('吃饭');
},
}
let newObj = {};
function kaobei (newObj, obj) {
for (let key in obj) {
if (newObj[key] instanceof Array) {
newObj[key] = [];
kaobei(newObj[key], obj[key]);
}else if (newObj[key] instanceof Object) {
newObj[key] = {};
kaobei(newObj[key], obj[key]);
}else {
newObj[key] = obj[key];
}
}
}
kaobei(newObj, obj);
obj.uname = '你好';
console.log(newObj, obj);