Literal:
- Criar objetos usando literais é mais simples e fácil de ler.
- Não há necessidade de resolução de escopo, mais rápido
dentro do novo:
- Crie um novo objeto
- Faça o novo objeto
__proto__
apontar para a função originalprototype
- Mude o ponto disso (apontando para o novo obj) e execute a função, e salve o resultado da execução como resultado
- Determine se o resultado da execução da função é nulo ou indefinido. Em caso afirmativo, retorne o novo objeto anterior. Caso contrário, retorne o resultado.
Manuscrito novo:
// 手写一个new
function myNew(fn, ...args) {
// 创建一个空对象
let obj = {}
// 使空对象的隐式原型指向原函数的显式原型
obj.__proto__ = fn.prototype
// this指向obj
let result = fn.apply(obj, args)
// 返回
return result instanceof Object ? result : obj
}