js基础

74 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

自定义构造函数

es5里面是没有class的,如果在es5里面想要描述一类对象,使用的语法叫: 自定义构造函数

固定语法:

function 类型的名字(属性参数){
  this.属性1 = 属性1;
  ...  
}

如果想要给对象添加方法

function 类名(形参属性){
  this.属性1 = 属性1;
  ...
  // 添加方法
  this.方法名 = function(){
    // 具体的实现过程
  }
  ...
}

自定义构造函数浪费内存

每次在new构造函数的过程中,都会调用构造函数一次,如果把方法也写在构造函数里面,每次new的时候,都会新建一个新的匿名函数——匿名函数的功能都是一样的,但是占用大量的内存。

函数也是对象

只要把函数当做键值对输出,console.dir(函数),发现函数其实也是键值对,所有的函数其实都是由Function构造函数所创建出来的实例对象

函数的创建方式,我们学过两种,这两种其实都是语法糖

函数本质都是由 Function 构造函数new出来的

var fn = new Function('a','b','return a + b;')

证明所有的函数都是由Function创建的

function f1(a,b,c){
  return a + b + c;
}
console.log(f1 instanceof Function);// true

var f2 = function(a,b){
  return a + b;
}
console.log(f2 instanceof Function);// true

以上代码就证明了所有的函数都是由Function构造函数new出来的

关键字 instanceof

该关键字的作用———— 判断某个对象是否该构造函数的实例对象

var arr = new Array();
console.log(arr instanceof Array);
console.log(arr instanceof Date);

函数对象身上也有会一条原型链

image.png

递归

什么是递归?

层层递进,层层回归

具体表现形式: 函数内部自己调用自己

使用递归解决从1到n的求和的问题

function fn(n){
  if(n === 1){
    return 1;
  }
  return n + fn(n-1);
}

递归图解

image.png

开发中递归一般会用在哪里呢?

深拷贝

遍历DOM树

生成菜单树