原型链
想要弄懂原型链首先要懂构造函数,原型对象和实例对象者之间的关系.
构造函数
所谓 ”构造函数”,就是一个普通的函数,只不过我们专门用它来生成对象(new 构造函数),这样使用的函数,就是构造函数.(一般默认函数名首字母大写)
构造函数: 有一个prototype属性, 指向原型对象
原型对象
创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。
constructor属于原型对象,指向构造函数
实例对象
new构造函数创建的对象就是实例对象
实例对象 : 有一个__proto__属性,指向原型对象
理清三者的关系后我们再来看看什么是原型链
原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构
原型链的作用:内存资源浪费 + 全局变量污染
面试点应该原型链最大的作用:继承
.对象访问原型链规则: 就近原则
- 先访问自己,自己没有找原型,原型没有找原型的原型,直到原型链终点。 如果还找不到,属性则获取undefined,方法则报错xxx is not defined
光看文字可能很难理解
闭包
闭包 = 函数 + 上下文的引用或者可以说一个访问另一个函数变量的函数
function fn(){
let a = 1
function fn1() {
console.log(a)
}
fn1()
}
当我在一个函数内部调用另一个函数的变量的时候就形成了闭包
最大的作用就是:减少变量污染
递归
-
1.递归函数:一个函数自己调用自己
-
2.递归函数特点
-
a.一定要有结束条件,否则会导致死循环
-
b.能用递归函数实现的需求,就一定可以用循环调用函数来解决,只是代码简洁与性能不同而已
-
一个函数递归
function fn(){
console.log('难受啊');
fn();
};
fn();
两个函数递归
function fn1(){
console.log('我爱你');
fn2();
};
function fn2(){
console.log('我不爱你了');
fn1();
};
fn2();
递归的作用: 遍历dom树 + 深拷贝
真要讲起来就太复杂了,想深入了解请百度