[分享一些小知识]

169 阅读2分钟

内置类的原型上的方法可以被修改 但是不能被重构。 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()