Open ChuChencheng opened 4 years ago
以下复述一遍 MDN 中的解释:
instance.__proto__ = F.prototype
this
根据以上定义,得到一个最简单的实现:
function _new (F, ...args) { const obj = Object.create(F.prototype) const ret = F.apply(obj, args) return typeof ret === 'object' ? ret : obj }
以上最简单的实现有几个方面没有考虑:
typeof ret === 'object'
function isConstructor (f) { if (f === Symbol) return false try { Reflect.construct(String, [], f) } catch (e) { return false } return true }
因为 typeof null === 'object' // true 和 typeof (function () {}) === 'function' // true 所以要对这两种类型另外判断:
typeof null === 'object' // true
typeof (function () {}) === 'function' // true
function isESObject (returnValue) { return (typeof returnValue === 'object' && typeof returnValue !== null) || typeof returnValue === 'function' }
。
以上改进内容参照 https://github.com/francecil/leetcode/issues/11 ,有关 new.target 的内容可到此链接查看
new 操作都做了什么
以下复述一遍 MDN 中的解释:
instance.__proto__ = F.prototype
)this
执行一遍构造函数最简单的实现
根据以上定义,得到一个最简单的实现:
不足
以上最简单的实现有几个方面没有考虑:
typeof ret === 'object'
是不够的改进
判断 F 是否满足构造函数
判断返回值
因为
typeof null === 'object' // true
和typeof (function () {}) === 'function' // true
所以要对这两种类型另外判断:new.target 处理
。
以上改进内容参照 https://github.com/francecil/leetcode/issues/11 ,有关 new.target 的内容可到此链接查看