new是什么
在javaScript中, new操作符用于创建一个给定构造函数的实例对象。
注意: 构造函数中如果有显示的返回值:
- 返回原始值,无用,this依然指向实例对象,
- 返回一个对象,this指向这个对象
如下:
function Test(name) {
this.name = name
return 1
}
const t = new Test('xxx')
console.log(t.name) // 'xxx'
function Test(name) {
this.name = name
console.log(this) // Test { name: 'xxx' }
return { age: 26 }
}
const t = new Test('xxx')
console.log(t) // { age: 26 }
console.log(t.name) // 'undefined'
new操作符做了什么
- 在堆内存中开辟一个空间,创建一个新空对象
- 把这个空对象的原型(proto)和构造函数的原型对象(constructor.prototype)连接
- 构造函数中的this指向这个空对象
- 执行构造函数方法,属性和方法被添加到this引用的对象中
- 如果构造函数中没有返回其它对象,那么返回this,即创建的这个的新对象,否则,返回构造函数中返回的对象。
手写new操作符
function _new(constructor, ...args){
// 创建的新对象
const obj = {};
// 执行[[原型]]连接, obj是constructor的实例
obj.__proto__ = constructor.prototype;
// 执行构造函数,将属性或方法添加到创建的空对象上
let result = constructor.apply(obj, args);
//如果构造函数执行的结构返回的是一个对象,那么返回这个对象
//如果构造函数返回的不是一个对象,返回创建的对象
return result instanceof Object ? result : obj
}
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.say = function () {
console.log(this.name)
}
let p = _new(Person, "huihui", 123)
console.log(p) // Person {name: "huihui", age: 123}
p.say() // huihui