new关键字
-
创建一个空对象
-
this指向这个空对象
-
给这个空对象赋值
-
返回对象
补充:new构造函数中如果手动return
return值为值类型 无效 返回new创建的对象
return值为引入类型 有效 会覆盖new创建的对象
原型对象
-
原型对象:任何函数创建的时候,系统会自动创建与之对应的对象,称之为原型对象
-
原型对象的作用:解决构造函数 内存浪费+变量污染
-
构造函数,原型对象,实例对象三者之间的关系
- prototype:属于构造函数,指向原型对象
- proto:属于实例对象,指向原型对象
- constructor:属于原型对象,指向构造函数
面向对象三大特征
- 封装:把代码放入对象的方法中
- 继承:子对象拥有父对象所有的成员(js主要用于继承)
- 多态:一个对象不同的情况下的不同状态(多态是Java语言特长,js基本不涉及)
原型链
-
每一个实例对象都有自己的原型,而原型也是对象,也有自己的原型,以此类推形成链式结构称之为原型链
-
对象访问原型链规则:就近原则 对象优先访问自己的属性,如果没有就访问自己的原型,如果原型没有就访问原型的原型,直到原型链的终点null
-
经典面试题
- 原型链的作用:继承
- js如何实现面向对象继承:原型链
instanceof原理
检测右边构造函数原型在不在左边实例对象的原型中
环境对象this:谁调用我,我指向谁
-
普通函数:函数名()this指向window
-
对象方法:对象名.方法名()this指向对象
-
构造函数:new 函数名()this指向new创建实例对象
小技巧:没点没new是window,有new是实例,有点是点左边的对象
call apply bind区别
共同点:
都可以修改this指向,第一个参数都是修改的this
不同点:
- 传参方式不同:call是逐一传参,apply是数组/伪数组传参
- 执行机制不同:call和apply会立即执行函数,bind不会立即执行
闭包是什么
-
闭包是一个访问其他函数内部变量的函数
-
闭包=函数+上下文引用
闭包的作用:解决变量污染
递归函数
-
一个函数在内部调用自己
递归函数和循环类似的,也需要有结束条件
深拷贝和浅拷贝
-
浅拷贝:拷贝地址 ,修改拷贝后的数据对原数据有影响 let newobj = obj
-
深拷贝:拷贝数据,修改修改后的数据,对原数据没有影响
- 先把js对象转换成JSON字符串 let jsonstr = JSON.stringify(obj)
- 再把JSON字符串转换成js对象 let newobj = JSON.parse(jsonstr)
箭头函数this:箭头函数没有this
本质通过作用域链,访问上级this
以下几种不能是箭头函数
- 构造函数
- call()无法修改箭头函数this
- 事件处理函数
展开运算符 ...
- 相当于对象遍历的一种简写
- 语法: ...对象名