1丶class类继承
下面用代码给大家演示:
class Stutent {
constructor(name, age) {
this.name = name;
this.age = age;
this.eat = function(){
return (`姓名:${this.name},年龄:${this.age}`)
}
}
}
class Teacher extends Stutent {
constructor(name, age, run) {
super(name, age);
this.run = run;
}
}
let Wang = new Teacher("小王", 24,"跑");
console.log(Wang.name)
console.log(Wang.age)
console.log(Wang.run)
console.log(Wang.eat())
2丶原型和原型链
原型
1. prototype
每个函数都有一个prototype属性,被称为显示原型
2._ proto _
每个实例对象都会有_ proto 属性,其被称为隐式原型
每一个实例对象的隐式原型 proto _属性指向自身构造函数的显式原型prototype
原型链
当一个对象调用自身不存在的属性和方法时就回去自己的proto的前辈prototype对象上去找。
如果没找到就会去prototype的前辈上去找 直到找到或者返回undefiend 这个链式查找的过程就是原型链。
3丶原型三角关系
-
prototype:指向原型对象(函数特有属性)
-
proto:指向构造该对象的构造函数的原型对象
-
constructor:指回该原型对象中的构造函数
5丶全局作用域和局部作用域
-
js中首先有一个最外层的作用域,全局作用域;
-
js中可以通过函数来创建一个独立作用域称为函数作用域,函数可以嵌套,所以作用域也可以嵌套;
-
块级作用域(大括号,比如:if{},for(){},while(){}…)
6丶闭包
什么是闭包?
在javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包是指有权访问另一个函数作用域中的变量的函数。其本质是函数的作用域链中保存着外部函数变量对象的引用。
闭包的应用场景: -
函数作为参数被传递
-
函数作为返回值被返回
-
函数防抖、函数节流
// 函数作为返回值
function create(){
let a = 200
return function(){
console.log(a);
}
}
let fn = create()
let a = 300
fn() //200
// 函数作为参数被传出去
function print(fn){
let a = 500
fn()
}
let a = 200
function fn(){
console.log(a);
}
print(fn)//200
闭包的优点:
- 变量长期驻扎在内存中
- 另一个就是可以重复使用变量,并且不会造成变量污染
闭包的缺点
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
解决方法是,在退出函数之前,将不使用的局部变量全部删除。
7丶this指向问题? - 如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window。
function a(){
var user = "子";
console.log(this.user); //undefined
console.log(this); //Window
}
window.a();
- 如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
var o = {
user:"子",
fn:function(){
console.log(this.user); //子
}
}
o.fn();
- 如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。
var o = {
a:100,
b:{
a:200,
fn:function(){
console.log(this.a); //200
}
}
}
o.b.fn();
总结:
普通函数中调用,this指向window
对象方法中调用,this指向当前对象
call apply bind中调用, this指向被传入的对象
class中的方法中调用, this指向实例对象
箭头函数,this就是父级上下文中的this。
8丶什么是宏任务和微任务
宏任务包括:setTimeout setInterval Ajax DOM事件
微任务:Promise async/await
微任务比宏任务的执行时间要早
9丶异步和单线程
异步和单线程是相辅相成的,js是一门单线程脚本语言,所以需要异步来辅助。
异步和同步的区别:
- 异步不会阻塞程序的执行,
- 同步会阻塞程序的执行,
异步场景 - 定时器
- 网络请求