js 中常用的一些方法的代码实现
new 操作 引用 MDN 上的相关描述:new 关键字会进行如下的操作:
创建一个空的简单 JavaScript 对象(即{}); 链接该对象(设置该对象的 constructor)到另一个对象 ; 将步骤 1 新创建的对象作为 this 的上下文 ; 如果该函数没有返回对象,则返回 this。
1 2 3 4 5 6 7 8 9 10 11 12 13 function newFunction ( ) { var res = Object .create(null ); var construct = Array .prototype.shift.call(arguments ); res.__proto__ = construct.prototype; var conRes = construct.apply(res, arguments ); return conRes instanceof Object ? conRes : res; }
new.target new 是从构造函数生成实例的命令。ES6 为 new 命令引入了一个 new.target 属性,(在构造函数中)返回 new 命令作用于的那个构造函数。如果构造函数不是通过 new 命令调用的,new.target 会返回 undefined,因此这个属性可以用来确定构造函数是怎么调用的
bind 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function .prototype.bind = function (context ) { if (typeof this !== "function" ) { throw new TypeError ("not a function" ); } let self = this ; let args = [...arguments].slice(1 ); function Fn ( ) {} Fn.prototype = this .prototype; let bound = function ( ) { let res = [...args, ...arguments]; context = this instanceof Fn ? this : context || this ; return self.apply(context, res); }; bound.prototype = new Fn(); return bound; }
Object.create 方法创建一个新对象,使用现有的对象来提供新创建的对象的proto
1 2 3 4 5 6 7 8 9 10 11 12 13 function (obj ) { let oo = {}; oo.__proto__ = obj; return oo; } 因为__proto__从web标准中删除,所以第二种更好funciton (obj ) { function Fn ( ) {} Fn.prototype = obj; return new Fn() }
instanceof 1 2 3 4 5 6 7 8 9 10 function _instanceof (left, right ) { var prototype = right.prototype; var proto = left.__proto__; while (true ) { if (proto === null ) return false ; if (proto === prototype) return true ; proto = proto.__proto__; } }
这个函数无法做到与原生的 Object.create 一致,一个是不支持第二个参数,另一个是不支持 null 作为原型
数组扁平化 flat 使用 flat 1 let result = arr.flat(Infinity );
使用递归的方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 有一个多维数组var arr=[1 ,2 ,3 ,[4 ,5 ],[6 ,[7 ,[8 ]]]] 处理后转为一维数组var arr = [1 , 2 , 3 , [4 , 5 ], [6 , [7 , [8 ]]]];function myFlat ( ) { let result = []; return function flat (arr ) { if (arr instanceof Array ) { if (arr.length === 0 ) return []; for (let item of arr) { if (item instanceof Array ) { result.concat(flat(item)) } else { result.push(item) } } } return result; } }console .log(myFlat()(arr));
async await promise.all()