# js之手写new
# new 都做了什么?
- 创建一个空对象({})
- 链接该对象到另外一个对象
- 将创建的空对象作为this的上下文
- 如果该函数没有返回对象,则返回this
高程4
- 在内存中创建一个新对象
- 这个新对象内部的 [[Prototype]] 指针被赋值为构造函数的 prototype 属性
- 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)
- 执行构造函数内部的代码(给新对象添加属性)
- 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象
# 实现new
// 模拟new关键字
function _new(constructor, ...args) {
// let obj = {} // 1. 创建一个空对象({})
// obj.__proto__ = Func.prototype // 2. 链接该对象到另外一个对象
let obj = Object.create(Func.prototype) // 替代1 2
const ret = constructor.call(obj, ...args) // 3. 将创建的空对象作为this的上下文
return typeof ret === 'object' ? ret : obj // 4. 如果该函数没有返回对象,则返回this
}
# 测试代码
function _new(constructor, ...args) {
let obj = Object.create(Func.prototype)
const ret = constructor.call(obj, ...args)
return typeof ret === 'object' ? ret : obj
}
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.getAge = function(){
return this.age
}
let zhang = _new(Person, 'zhang', 18);
console.log('_new', zhang)
let jiao = new Person('jiao', 18)
console.log('new', jiao)
console.log(jiao.__proto__.too === zhang.__proto__.too)
console.log(jiao.getAge(), zhang.getAge())