实例一个构造函数:
// 1.创建一个构造函数
function Person(name, age) {
// 在构造函数中写属性
this.name = name
this.age = age
}
// 在原型对象中写方法
Person.prototype.sayHiName = function (name, age) {
console.log(`我是${this.name},今年${this.age},我会说嗨~`)
}
// 2.实例化构造函数
let xiaoXiao = new Person('小小',18)
实例构造函数时,new方法的执行过程是怎样的呢?
1.创建一个空的新对象
let 新对象 = {}
2.让新对象的原型对象与构造函数的原型对象相等(改变新对象的this指向)
新对象 = Object.create(构造函数.prototype)
3.执行构造函数中的属性与方法
let a = 构造函数.call(新对象,形参)
4.返回新对象
return a === Object ? a:新对象
知道了new的执行过程,那就可以手写一个new方法了
// 声明myNew函数
let myNew = function (fun,...args) {
// 1.创建一个新对象
let obj = {}
// 2.让this指向这个新对象,新对象的__proto__ = 构造函数的prototype
// 1. obj.__proto__ = fun.prototype 的方式,不推荐
// 2. .create()方法,使用现有对象的prototype来作为新创建对象的prototype
obj = Object.create(fun.prototype)
// 3.执行构造函数的代码,将方法与属性添加到新对象中
let father = fun.call(obj,...args)
// 4.返回执行完毕的新对象
return father === Object ? father:obj
}