js 콜, apply, bid, instanceof 방법 을 수 동 으로 실현 합 니 다.

17439 단어 JS
js 의 call, apply, bind, instanceof 방법 을 수 동 으로 실현 합 니 다.
call 방법
apply 방법
bid 방법
call 방법
/**
 *     caLl  
 */

Function.prototype.mycall = function(context) {
  //           
  context = context || window;
  //       
  let args = [...arguments].slice(1);
  //            
  context.fn = this;
  //    
  let result = context.fn(...args);
  //     ,         
  delete context.fn;
  return result;
}

function Test() {
  console.log(this.name);
  console.log(this.sex);
}

let obj = {
  name: '  ',
  sex: ' '
}

Test.mycall(obj)

실행 결과
  
 

적용 방법
/**
 *   apply  
 *        apply  
 */

Function.prototype.myapply = function(context) {
  context = context || window;
  context.fn = this;
  let result;
  if (arguments[1]) {
    result = context.fn(...arguments[1]);
  } else {
    result = context.fn();
  }
  delete context.fn;
  return result;
}

function fn(name, sex) {
  this.name = name;
  this.sex  = sex;
  console.log(this.name);
  console.log(this.sex);
}

let obj = {};
fn.myapply(obj,['  ',' ']);

실행 결과
  
 


bind 방법
/**
 *     bind  
 */
Function.prototype.mybind = function(context) {
  if (typeof this !== 'function') {
    return new Error("      ");
  }
  let _this = this; //      
  let args = [...arguments].slice(1);
  return function F(...newArgs) {
    //bind       ,             
    if (this instanceof F) {
      return new _this(...args,...newArgs);
    } else {
      return _this.apply(context,args.concat(newArgs));
    }
  }
}

function parent(sex) {
  console.log(sex);
  console.log(this.name);
  
}
let Son = {
  name: 'zhangsan'
}
let son = parent.mybind(Son,' ');
son();

실행 결과
 
zhangsan

instanceof 판단 속성
/**
 *     instanceof     
 * instanceof              __proto__   
 *               true
 */

function myInstanceoF(left, right) {
  //             
  let prototype = right.prototype;
  left = left.__proto__;
  while (true) {
    if (left == null) {
      return false;
    } else if (left == prototype) {
      return true;
    }
    left = left.__proto__;
  }
}
function Hello(name) {
  this.name = name;
}
let test = new Hello('  ');
let arr = new Array('33');
console.log(myInstanceoF(arr, Array));
console.log(myInstanceoF(test, Hello));
console.log(myInstanceoF(arr, Hello));

실행 결과
true
true
false

좋은 웹페이지 즐겨찾기