function myNew(fn,...args){ if(typeof fn !== 'function){ return TypeError('fn must be a function') } //let obj = {} 创建一个空对象 //obj.__proto__ = fn.prototype 将空对象的原型 设置为构造函数fn的 prototype 原型属性 //创建对象,并指定原型,也可以用下面的代码 let obj = Object.create(fn.prototype) //Object.create(proto) 创建一个对象,并指定其原型 //执行构造函数,并改变this指向 let result = fn.apply(obj,args) //let result = fn.call(obj,...args) return typeof result === 'object' ? result : obj }
/**
* 用法:instanceof 运算符是用检测构造函数的 prototype 属性是否出现在 某个实例对象的原型链上
* 思路:
* 1.通过Object.getPrototypeOf获取 obj 原型
* 2. 循环判断 objPrototype 是否和 构造函数的原型相等;如果相等返回true;
* 3. 如果不相等就继续obj原型上的原型(Object.getPrototypeOf(objPrototype))
* 4. 判断objPrototype是否为 null,如果为null 说明不存在,返回false
*/
function myInstanceof(obj, fn){ if(typeof fn !== 'function'){ return false } //let objPrototype = obj.__proto__; let objPrototype = Object.getPrototypeOf(obj) //Object.getPrototypeOf() 和obj.__proto__可以互换使用,单位了代码的健壮he可维护性,建议使用Object.getPrototypeOf() while(true){ if(objPrototype === null){ return false } if(objPrototype === fn.prototype){ return true } //objPrototype = objPrototype.__proto__ objPrototype = Object.getPrototypeOf(obj) } }
标签:面试题,obj,Object,js,原型,let,手写,fn,objPrototype From: https://www.cnblogs.com/yangkangkang/p/18393214