Function.prototype.call = function(context,...args){
var context = context || window;
context.fn = this;
var result = eval(`context.fn(...args)`);
delete context.fn;
return result;
}

call的实质就是调用函数时候改变函数中this的指向,利用对象中函数调用时候 this指向这个对象的特性我们给函数加上fn属性,指向函数本身,然后调用这个函数。指向就变成了fn前面的context也就是call的第一个参数;

Function.prototype.apply = function (context, args) {
let context = context || window;
context.fn = this;
let result = eval('context.fn(...args)'); delete context.fn
return result;
}

  

apply同理 只是参数改变成为了数组

bind

  1. 对于普通函数,绑定this指向

  2. 对于构造函数,要保证原函数的原型对象上的属性不能丢失

Function.prototype.bind = function (context, ...args) {
// 异常处理
if (typeof this !== "function") {
throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
}
// 保存this的值,它代表调用 bind 的函数
var self = this;
var fNOP = function () {}; var fbound = function () {
self.apply(this instanceof self ?
this :
context, args.concat(Array.prototype.slice.call(arguments)));
} fNOP.prototype = this.prototype;
fbound.prototype = new fNOP(); return fbound;
}

instanceOf

用法是a instanceOf A  原理是通过 a 的原型链和A的原型来判断a是否是A的实例

 1 function instance_of(L, R){
2 const baseType = ['string', 'number','boolean','undefined','symbol'];
3 if(baseType.includes(typeof L)) return false
4
5 let RP = R.prototype; // 取R的原型
6 L = L.__proto__; // 取L的原型链
7 while(true){
8 if(L === null){
9 return false;
10 }
11 if(L === RP){
12 return true;
13 }
14 L = L.__proto__; // 没找到继续造
15
16 }
17 }

flat : 利用递归,依次遍历

 Array.prototype.myFlat2 = function(arr){
let newArr=[]; (function flatArr(arr){
arr.forEach((item,idx) => {
if(typeof item != 'object'){
newArr.push(item)
}else{
flatArr(arr[idx])
}
})
})(arr)
return newArr;
}
let a = [1,[1,2,3],[[1,23],[12,11]]];
console.log(Array.prototype.myFlat2(a));

filter

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。 

Array.prototype.filter = function(fn){
var _this;
if (typeof fn !== "function") {
throw "参数必须为函数";
} //get array going to be iterated
let arr = this;
if (!Array.isArray(arr)) {
throw "只能对数组使用forEach方法";
} if (arguments.length > 1) {
_this = thisArg;
}
let result = []; for (let index = 0; index < arr.length; index++) {
let invokedReturn = fn.call(_this, arr[index], index, arr);
if (invokedReturn) {
result.push(arr[index]);
}
}
return result;
}

new: js高级程序设计第四版中对于new的描述如下

1. 在内存中创建一个新对象;

2. 这个新对象内部的[[prototype]]特性被复制为构造函数的prototype属性

3. 构造函数内部的this被赋值为这个新对象

4. 执行构造函数内部代码

5. 如果构造函数返回非空对象,则返回该对象,否则返回刚创建的实例

function myNew(ctor, ...args){
if(typeof ctor !='function'){
throw 'newOperator function the first param must be a function';
}
let obj = new Object();
obj.__proto__ = Object.create(ctor.prototype); // 关键步骤1
let res = ctor.call(obj, ...args)// 关键步骤2
if(result !== null && /^(object|function)$/.test(typeof res)){ return result } }

防抖

节流

深浅拷贝

数组乱序

数组去重

八种继承及各种继承之间的特点

lazyman

jsonp的实现

函数的柯里化

高频重要前端API手写整理(call,apply,bind,instanceof,flat,filter,new,防抖,节流,深浅拷贝,数组乱序,数组去重,继承, lazyman,jsonp的实现,函数的柯里化 )的更多相关文章

  1. JS 函数的柯里化与反柯里化

    ===================================== 函数的柯里化与反柯里化 ===================================== [这是一篇比较久之前的总 ...

  2. 关于arguments对象以及函数的柯里化;

    1.arguments对象 Arguments是个类似数组但不是数组的对象,说他类似数组是因为其具备数组相同的访问性质及方式,能够由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性 ...

  3. 浅析 JavaScript 中的 函数 currying 柯里化

    原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...

  4. Scala_方法、函数、柯里化

    方法.函数.柯里化 方法 声明方法: scala> def m1(x:Int,y:Int):Int = {     | x + y     | }m1: (x: Int, y: Int)Ints ...

  5. js高阶函数--判断数据类型、函数胡柯里化;

    一.判断数据类型: 常见的判断有typeof.instanceof. constructor. prototype,先来看typeof: var a = "hello world" ...

  6. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...

  7. 前端开发者进阶之函数反柯里化unCurrying

    函数柯里化,是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了缩小适用范围,创建一个针对性更强的函数. 那么反柯里化函数,从字面讲,意义和用法跟函数柯里化相比正好相反,扩大适用 ...

  8. JavaScript函数的柯里化(currying)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...

  9. 理解运用JS的闭包、高阶函数、柯里化

    JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...

随机推荐

  1. 微信小程序简易富文本

  2. LGP2490题解

    有点儿神秘? 根据他这个题意说的,白子向右的第一个一定是对应的黑子啊. 所以棋子的绝对位置是不重要的,我们只需要考虑白子和黑子的相对位置,然后考虑用 GF 来拼凑状态就好了. 下面的 \(k\) 是题 ...

  3. centos5 源失效解决办法

    将源文件备份 [base] name=CentOS-$releasever - Base failovermethod=priority baseurl=http://vault.centos.org ...

  4. (acwing蓝桥杯c++AB组)1.1 递归

    (acwing蓝桥杯c++AB组)1.课程介绍+递归 文章目录 (acwing蓝桥杯c++AB组)1.课程介绍+递归 课程介绍 第一讲 递归与递推 递归 引入 递归的底层调用顺序 例题与练习 课程介绍 ...

  5. VS code 设置中文语言环境(实现语言切换自由)

    1.打开vs code,然后按快捷键ctrl+shift+p,输入configure language>回车 2.选择Install Additional Languages... 3.在左侧选 ...

  6. Hash链表转换为红黑树,和树转换为链表的条件

    链表转换位红黑树 两个条件,必须同时满足两个条件才能进行转换 条件1:单个链表长度大于等于8 条件2:hashMap的总长度大于64个.且树化的节点位置不能为空 从源码看 条件一: 在putVal() ...

  7. S7-1200在博途V16中新建数据块(DB)

    硬件环境: S7-1200 CPU V4.4(6ES7 212-1AE40-0XB0) 软件环境: (1)Windows 10 Professional SP1 64位 (2)STEP7 V16 SP ...

  8. Lock 与 Synchronized 的区别?

    首先两者都保持了并发场景下的原子性和可见性,区别则是synchronized的释放锁机制是交由其自身控制,且互斥性在某些场景下不符合逻辑,无法进行干预,不可人为中断等.而lock常用的则有Reentr ...

  9. Dubbo 的整体架构设计有哪些分层?

    接口服务层(Service):该层与业务逻辑相关,根据 provider 和 consumer 的 业务设计对应的接口和实现 配置层(Config):对外配置接口,以 ServiceConfig 和  ...

  10. Python包装器

    def func(): print("func body") def f1(arg): print("f1:",arg) def wrapper(b): pri ...