一些常见的手写的题

93 阅读1分钟

模拟实现object create

/*
 * 将传入的对象作为构造函数的原型
*/
function myCreate (obj) {
    function F () {}
    F.prototype = F;
    return new F();
}

模拟实现instanceOf

/*
 * 判断传入的对象,是否出现在原型链上的任何位置
*/
function myInstanceOf (left, right) {
    let _left_prototype = Object.getPrototypeOf(left);
    let _right_prototype = right.prototype;
    while (_left_prototype) {
        if (_left_prototype === _right_prototype) {
            return true;
        }
        _left_prototype = Object.getPrototypeOf(left);
    }
    return false;
}

模拟实现new

 /*
  * 1、创建一个空的对象,设置原型,将函数的原型指向空对象
  * 2、绑定this,将函数的原型this指向对象
  * 3、执行构造函数的代码
  * 4、判断构造函数的返回值,如果返回值为引用类型,返回引用类型对象,否则返回创建的空对象
 */
 function myNew () {
     const _constructor = Array.prototype.shift.call(arguments);
     if (typeof _constructor !== 'function') {
         console.error('type error!!!');
         return
     }
     const newObj = Object.create(_constructor.prototype);
     const result = _constructor.apply(newObj, arguments);
     const flag = result && (typeof result === 'object' || typeof result === 'function');
  // 判断返回结果
  return flag ? result : newObj;
 }