JS 手写call


//ctx :三種情況,null/undefined ,基本類型,普通對象
Function.prototype.myCall = function (ctx, ...args) {
  //ctx :this綁頂的對象,可以是null,undefined,{} ,原始類型的數據(轉換為對應的包裝類型)
  //參數歸一化,將不同類型的參數轉換為一種形式
  //globalThis 不一樣的環境,轉換為對應的全局this,node環境為global,瀏覽器環境為window
  //Object(value) 將參數轉化為對象,基本類型轉換為對應的包裝類型,對象則返回對象本身
  ctx = ctx === null || ctx === undefined ? globalThis : Object(ctx);
  const key = Symbol(); //保證唯一性
  //ctx[key] = this; //this就是調用myCall的方法
  Object.defineProperty(ctx, key, {
    value: this,
    enumerable: false, //不可枚舉,返回的this中key不可見
  });
  const r = ctx[key](...args); //直接使用ctx來調用函數,不借住apply,bind
  delete ctx[key]; //運行之後就不需要了
  return r;
};

let bob = {
  name: "aa",
  age: 18,
};
function fn() {
  console.log("this:", this);
}
fn.myCall(bob, 1, 2);


Function.prototype.myBind = function (ctx, ...args) {
  const fn = this;
  return function (...newArgs) {
    if (new.target) {
      return new fn(...args, ...newArgs);
    }
    return fn.apply(ctx, [...args, ...newArgs]);
  };
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值