01 对象的深/浅拷贝
1.1 变量的存储
基本类型:基本类型的值存在栈内存中
引用类型: 引用类型的地址存储在栈内存中,他的值存储在堆内存中,通过指针(地址)连接
1.2 变量拷贝
基本类型:基本类型拷贝的是值
引用类型:引用类型拷贝的是变量的地址,会造成数据共享问题
1.3 变量的传递
基本类型: 基本类型传递的是值
引用类型: 引用类型传递的是地址,会造成数据共享问题
1.4 对象的浅拷贝
方法1:Object.assign({},需要拷贝的对象)
const obj1 = Object.assign({}, obj) // Object.assign 需要传入第一个参数为空对象
方法2: for...in循环生成新的对象
let obj1 = {} // 键名 : 键值
for (const key in obj) {
obj1[key] = obj[key]
}
console.log(obj1);
1.5 对象的深拷贝
方法1: JSON.parse(JSON.stringify(你需要拷贝的数据)) (能解决你98%的问题)
const obj1 = JSON.parse(JSON.stringify(obj))
方法2: lodash.js方法库 其中cloneDeep (能解决你100%的问题)
1.先下载 自己搜lodash官网 2.引入 <script src="./lodash.min.js"></script> 3.使用lodash方法库里面的一个叫做深克隆的方法 cloneDeep (_就代表loadsh实例对象) const obj1 = _.cloneDeep(obj) // 注意:防抖函数 、 节流函数
2.0 变量的类型检测
2.1 typeof -- 检测引用类型结果都为object

2.2 instanceof -- 检测变量是否为构造函数的实例对象
变量 instanceof 构造函数
缺陷:检测的变量是否为对象构造函数的实例时,结果都为true
2.3 Array.isArray() -- 检测是否为数组
Array.isArray('变量')
缺陷:只能检测数组
2.4 Object.prototype.toString.call() -- 检测所有的数据类型(不包括你自己的构造函数)
// 获取变量类型的最终解决方案 Object.prototype.toString
const getType = Object.prototype.toString
console.log(getType.call([]));
console.log(getType.call({}));
console.log(getType.call(new Date()));
console.log(getType.call(new Error()));
课堂练习:
封装一个函数,传入你的变量,检测出类型,并且小写
3.0 ES5的继承 [背]
什么是继承?
子类继承父类的一切特征(属性和方法),子类也可以修改和追加属性和方法。
寄生组合式继承的实现方法:
1、子类继承父类的属性 : 父类.call(this,属性1,属性2)
2、子类继承父类原型上的方法 : 子类.prototype = Object.create(父类.prototype)
3、 修改子类原型对象中构造器(constructor)的指向 : 子类.prototype.constructor = 子类函数
4、最后再子类定义或修改自己的原型方法
// 寄生组合继承的实现
// 创建一个父类
function Person(name, age, sex) {
this.name = name
this.age = age
this.sex = sex
}
// 定义原型上的方法
Person.prototype.say = function () {
console.log(`${this.name}说了什么`);
}
// 创建一个子类
function Student(name, age, sex, sid) {
// 1、子类继承父类的属性
Person.call(this, name, age, sex)
this.sid = sid
}
// 2、子类继承父类原型上的方法
Student.prototype = Object.create(Person.prototype)
// 3、修改原型对象中构造器的指向
Student.prototype.constructor = Student
// 4、子类定义或修改自己的方法
Student.prototype.run = function () {
console.log(`${this.name}跑起来了`);
}
const s1 = new Student('张三', 18, '女', '00001')
console.log(s1);
s1.say()
// 每一个函数都有一个原型对象
console.log(Student.prototype);
// 每一个对象都有一个隐式原型,指向函数的显式原型
console.log(s1.__proto__);
// 原型对象都有一个构造器(constructor) 指向函数本身
console.log(Student.prototype.constructor) // Person



















