如何实现符合规范的Object.create polyfill解决测试失败问题
Object.create polyfill 实现修复
原代码问题点
- 处理
proto = null的逻辑错误:直接返回{}会导致新对象原型指向Object.prototype,而非要求的null,不符合规范 propertiesObject参数处理完全缺失:原代码中只要传入第二个参数就直接无值返回,没有调用Object.defineProperties给新对象设置属性
正确实现代码
Object.create = function(proto, propertiesObject) { // 边界校验:无参数/第一个参数不是对象/函数/NULL时抛出类型错误 if (arguments.length === 0 || (typeof proto !== 'object' && typeof proto !== 'function')) { throw new TypeError('Object prototype may only be an Object or null: ' + proto); } // 用空构造函数创建指定原型的新对象 function F() {} F.prototype = proto; const newObj = new F(); // 如果传入属性配置,调用defineProperties设置属性 if (typeof propertiesObject !== 'undefined') { Object.defineProperties(newObj, propertiesObject); } return newObj; };
修复说明
- 新增无参数调用的校验逻辑,符合规范要求
- 统一使用空构造函数的方式创建对象,当
proto = null时,空构造函数的原型设为null,生成的新对象原型自然指向null,满足测试要求 - 补充第二个参数的处理逻辑,创建完基础对象后如果传入了属性配置,就调用
Object.defineProperties完成属性设置,再返回最终对象
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

