内置类的原型上的方法可以被修改 但是不能被重构。 this 都是当前类的实例
函数的三种角色
普通函数
形参 实参 this return 作用域 变量
类
new 实例 this 原型 原型链 __proto__ 基类
对象
属性名 属性值
call 是用来改变函数内部的this 指向的
call 可以让函数执行 并且可以改变函数执行时 内部的this的指向 this 指向了call第一个实参 call后边的所有的参数 都被当做实参 传给了前面的函数
call 方法实在Function类的原型上
// 自己实现 一个myCall方法 用法等同于call
Function.prototype.myCall = function myCall(context, ...arg) {//剩余运算符
//this 就是fn
//this(...arg)//扩展运算符
//让fn(this) 执行 并且让 函数中的this 是context
//context.qqq() qqq执行时 里边的this 是 conrext
// context.qqq=this;
// context.qqq(...arg);
// delete context.qqq;
context = context || window;//写一个容错机制
let a = Symbol()//产生一个唯一的不会重复的值
context[a] = this;//context.qqq---->fn
let res = context[a](...arg);//让fn执行了
delete context[a];//删除增加的属性
return res
}
fn.myCall(obj, 6, 6, 6);//让 fn执行 fn中的this 指向obj 把666传给fn
/* apply 功能类似于call */ function fn() { console.log([...arguments]); console.log(this); console.log('----------------');
}
var obj = {
a: 123,
b: 31
}
// fn.call(obj, 5, 3, 2, 1);
// fn.apply(obj, [5, 3, 2, 1]);//第二个参数是个数组或者类数组的集合 虽然是以一个集合的形式传过去的;但是 fn 接受时还是以散乱的形式接受的
Function.prototype.myApply = function myApply(context,ary) {
arg = arg || []
let a = Symbol();
context[a]=this;
let res = context[a](...ary);
delete context[a];
return res;
}
fn.myApply(obj,[5,3,2,1])
/* bind 用法和call一样 bind的返回值是一个新函数 新函数执行 fn才会执行 fn中的this这是才会被改成obj f中的this 不会发生任何改变了 在使用 call apply 也不好使 fn.bind(obj,1,2,3)
call paaly 都是让函数立即执行了 但是bind 是返回了一个新函数
*/
function fn() {
console.log([...arguments]);
console.log(this);
console.log('------------------------------');
return 123;
}
var obj = {
a: 12,
b: 23
}
fn.call(obj, 1, 2, 3, 4)
var f = fn.bind(obj, 6, 6, 6, 6);//f执行 让 fn执行并且把6,6,6,6传给fn fn中的this指向是obj 把6,6,6,6理解为f的默认参数 再给f传递参数时会把传递的参数会补在 默认参数的后边
//实现一个myBind 用法等同于 bind;
Function.prototype.myBind = function (context, ...arg) {
//this -----> fn
var _this = this;
return function (...ary) {
return _this.apply(context,arg.concat(ary))
}
}
var f2 = fn.myBind(obj,6,6,6,6);
f2()