JS 面试问题: 手写 new 🆕
首先, new 操作符可以创建一个用户自定义的对象类型或者创建一个带有构造函数的内置对象类型.
当一个函数通过 new 方式调用时, 这个函数被当作一个构造函数. new 将做下面的事情
- 创建一个空的纯
JS对象. 我们称之为newInstance. - 将
newInstance的[[Prototype]]指向构造函数的prototype属性如果prototype是一个对象. 否则指向Object.prototype.- 📖原型链, 从构造函数创建的所有实例都可以访问添加到构造函数的
prototype上的属性或对象
- 📖原型链, 从构造函数创建的所有实例都可以访问添加到构造函数的
- 用给定的参数执行构造函数, 将
newInstance绑定为this上下文. 即在构造函数中所有对this的引用都将指向newInstance - 如果构造函数返回
non-primitive, 其将作为new操作符的返回值返回. 否则, 如果构造函数不返回任何值或者返回了primitive,new操作符返回newInstance.- 📖
primitive: 指null/undefined/string/number/boolean/bigint/symbol - 通常构造函数不返回值, 但是可以通过返回值来覆盖正常对象的返回过程.
- 📖
有了上面的介绍, 就可以开始写代码了
function myNew(constructor, ...args) {
// 第一步
let newInstance = {}
// 第二步
if (constructor.prototype !== null) {
Object.setPrototypeOf(newInstance, constructor.prototype)
} else {
Object.setPrototypeOf(newInstance, Object.prototype)
}
let result = constructor.apply(newInstance, args)
if (typeof result === 'object' && result !== null) {
return result
} else {
return newInstance
}
}
测试
function Person(name) {
return {
name,
sayName() {
console.log('this.name',this.name)
}
}
}
let p = myNew(Person, 'levi')
p.sayName()
console.log('p',p)
let p1 = new Person('levi')
p1.sayName()
console.log('p1',p1)
console.log('================================')
function Mistake() { return 1 }
let m = myNew(Mistake)
console.log('m',m)
let m1 = new Mistake()
console.log('m1',m1)

谢谢你看到这里😊
本文介绍了JavaScript中的new操作符的工作原理,包括创建新对象、设置原型链以及执行构造函数等步骤。并提供了一个手写new的示例代码,通过这个代码展示了如何模拟new的行为。同时,文中通过测试用例展示了构造函数返回不同类型的值时,new操作符的不同处理方式。
928

被折叠的 条评论
为什么被折叠?



