定义:调用一个对象的一个方法,以另外一个对象替换当前对象,传递多个参数数组
Person.prototype.sayHi=function (x,y) { console.log("您好啊:"+this.sex); return 1000; }; var per=new Person(10,"男"); function Student(name,sex) { this.name=name; this.sex=sex; } var stu=new Student("小明","人妖"); var r2=per.sayHi.call(stu,10,20);
定义:应用某一对象的一个方法,用另外一个对象替换当前对象,apply传递多个参数的时候第二个参数须要传递一个数组app
Person.prototype.sayHi=function (x,y) { console.log("您好啊:"+this.sex); return 1000; }; var per=new Person(10,"男"); function Student(name,sex) { this.name=name; this.sex=sex; } var stu=new Student("小明","人妖"); var r1=per.sayHi.apply(stu,[10,20]);
call 和 apply 都是为了解决改变 this 的指向。做用都是相同的,只是传参的方式不一样函数
bind也能改变this的指向,返回一个修改过的函数,但该函数不会被执行this
function f1(x, y) { console.log((x + y) + ":=====>" + this.age); } function Person() { this.age = 1000; } Person.prototype.eat = function () { console.log("这个是吃"); }; var per = new Person(); var ff = f1.bind(per, 10, 20);
Function.prototype.myCall = function (context) { var context = context || window // 给 context 添加一个属性,这里的this就是new出来的实例化对象 context.fn = this // 将 context 后面的参数取出来 var args = [...arguments].slice(1) var result = context.fn(...args) // 删除 fn delete context.fn return result }
Function.prototype.myApply = function (context) { var context = context || window context.fn = this var result // 须要判断是否存储第二个参数 // 若是存在,就将第二个参数展开 if (arguments[1]) { result = context.fn(...arguments[1]) } else { result = context.fn() } delete context.fn return result }
Function.prototype.myBind = function (context) { if (typeof this !== 'function') { throw new TypeError('Error') } var _this = this var args = [...arguments].slice(1) // 返回一个函数 return function F() { // 由于返回了一个函数,咱们能够 new F(),因此须要判断 if (this instanceof F) { return new _this(...args, ...arguments) } return _this.apply(context, args.concat(...arguments)) } }