需要了解:
原型链、this
开始:MDN对new
的介绍
[MDN new] (https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new)
new
创建一个用户定义的对象类型的实例
或具有构造函数的内置对象的实例
new 关键字会进行如下的操作:
步骤1: 创建一个空的简单 JavaScript 对象(即 {});
let obj = {}
步骤2: 为步骤 1 新创建的对象添加属性 proto,将该属性链接至构造函数的原型对象;
obj.__proto__ = constructor.Prototype
步骤3: 将步骤 1 新创建的对象作为 this 的上下文;
let res = constructor.apply(obj, args)
步骤4: 如果该函数没有返回对象,则返回 this。
由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象
(一般情况下, 构造函数不会有返回值,但是我们可以自己返回对象, 覆盖创建的动作)
function _new(constructor, ...args) {
// let obj = {}
// obj.__proto__ = constructor.Prototype
// 一个继承自 constructor.prototype 的新对象
let obj = Object.create(constructor.prototype)
let res = constructor.apply(obj, args)
// 如果构造函数没有返回对象, 则返回我们创建的对象
if(res instanceof Object) {
return res
} else {
return obj
}
}
现在我们调用一下_new
function Person(name) {
this.name = name
}
const per1= new Person("小王")
const per2 = _new(Person, '小王')
console.log(per1, per2)
注意! 模拟实现的函数_new传入的参数只能是构造函数,不能是类