手写代码(0) 开始手写代码之前,需要知道什么

前言

原本是打算把这周学到的手写代码总结一下写成一篇文章,但是写着写着,发现了很多重复的知识点,这里记录一下

原型链

之前总结过原型链,这里记一下关键部分。

原型通常指的是prototype(显式原型对象)和__proto__(隐式原型对象)这两个原型对象,__proto__的路径就叫原型链

原型链是实例对象与原型之间的连接,用来实现继承,若要查找某个对象上的属性或者方法,过程中会先查找自身,如果自身没找到会再顺着原型链逐级查找,若还是没找到则返回undefined

比如说let arr = new Array();我并没有给arr添加方法,但是它能执行arr.push(1);,因为当它自身没有这个方法时会沿着原型链找,而arr.__proto__ === Array.prototype,Array上有push方法,所以arr可以继承它拿来用

闭包

之前也总结过闭包,这里只记下关键部分

闭包就是上级作用域内变量的生命周期,因为被下级作用域内引用,而没有被释放,就导致上级作用域内的变量,等到下级作用域执行完之后才正常得到释放

在这里插入图片描述

cur等于调用test后返回的sum函数,多次调用cur()就是多次执行sum函数,明明sum里没有num,但还是更新输出了num。这就是闭包的作用:内部函数被保存到外部时,它也会将内部函数用到的变量保存下来,即使那个变量的作用域不属于内部函数

arguments转换成数组

arguments是类数组对象,当实参个数多于形参个数,可以通过arguments访问。代码中经常需要将它转化成数组使用,可以使用以下几种方法进行转化

  1. Array.prototype.slice.apply(arguments):使用数组原型上的方法,用apply等绑定arguments,可以看成是给arguments增加数组的slice方法
  2. 循环遍历放进数组
  3. [...arguments]:使用扩展运算符将arguments转为用逗号分隔的参数序列,再用[]将其转化成数组

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

构造函数

调用new时,如果构造函数中最后return一个指定对象,那么它会返回这个指定对象,但如果它return的是基本数据类型,或者没有写return,那么返回的就是新创建的继承自构造函数名.prototype的对象

在这里插入图片描述

在这里插入图片描述

apply/call/bind

详细的以后写在代码里,这里主要是想记下:

  1. apply/call会立即调用函数,返回执行结果,bind不会立即调用函数,返回一个修改this后的函数
  2. call,apply为了改变函数中this的指向,可以让任意对象调用任意函数,等同于将函数作为了对象的属性,可以通过对象.属性的方式调用函数

比如constructor.apply(newObject,arguments),实际上是给newObject添加了constructor属性,并调用这个属性:newObject.constructor(arguments)

函数后括号的作用

  1. 有括号:立即执行函数,返回结果
  2. 无括号:将函数作为对象赋值给变量

函数声明:function a(){},返回undefined(不会执行),仅仅是函数声明(声明提前)

函数表达式:let res = function a(){}(),立即执行该函数,必须使用一个变量接收返回值,否则报错

函数表达式:(function a(){})(),立即执行该函数,不必须使用变量接收

在这里插入图片描述

回看闭包的例子,test()代表执行test函数,返回的sum函数赋给了cur,所以cur = sum() {},注意此时没执行sum函数,之后cur()才执行sum函数,输出值,所以其实test只调用过一次,之后都是在调用sum

在这里插入图片描述

函数中this的指向

谁调用指向谁

  1. 全局函数:this指向window
    在这里插入图片描述

  2. 对象方法:this指向对象
    在这里插入图片描述

  3. 构造函数:this指向new创建的空对象
    在这里插入图片描述

在这里插入图片描述

因为func被myObject调用,所以this指向myObject,this又被赋值给self,self也指向myObject,因此输出两个1,之后闭包的内部函数被调用,实际上是全局在调用,this指向window,输出undefined,因为存在闭包,所以它会保存指向myObject的self,输出1

总结

学就完了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值