1.手动实现call、apply、bind
Function.prototype.mycall = function(obj){ var args = Array.prototype.slice.apply(arguments,[1]); obj.fn = this; obj.fn(...args);//es6的解构语法,也可以使用obj.fn.apply(obj,args); delete obj.fn; }
eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。
apply
Function.prototype.myapply = function(obj,arr){ obj.fn = this; if(!arr){ obj.fn(); }else{ var args = []; for(var i = 0; i < arr.length; i++) { args.push('arr[' + i + ']'); } eval('obj.fn('+args+')'); } delete obj.fn; }
bind
//简洁版的new操作符实现过程 function newFunc(constructor){ //第一步:创建一个空对象obj var obj = {}; //第二步:将构造函数 constructor的原型对象赋给obj的原型 obj.__proto__ = constructor.prototype; //第三步:将构造函数 constructor中的this指向obj,并立即执行构造函数内部的操作 constructor.apply(obj); //第四步:返回这个对象 return obj; }
希望有用

浙公网安备 33010602011771号