自己实现一个_new方法,模拟出内置new后的结果
一、JavaScript中new一个对象的过程:
- 创建一个新对象;
- 设置新对象的constructor属性为构造函数的名称,设置新对象的__proto__属性指向构造函数的prototype对象;
- 执行构造函数,并把函数中的this指向新对象;
- 返回新对象。
二、封装_new函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function _new(fn, ...arg){//fn为当前要new的构造函数,...arg为需要给构造函数传递的参数
let obj = {}
obj.__proto__ = fn.prototype//让新对象的原型链指向构造函数的原型
fn.call(obj, ...arg)//执行构造函数,并把...arg里面的参数传入,同时改变this指向新对象
return obj
}
// 利用Dog构造函数测试
function Dog(name){
this.name = name
}
Dog.prototype.bark = function(){
console.log(this.name)
}
Dog.prototype.sayName = function(){
console.log('I am' +' '+ this.name)
}
let test = _new(Dog, 'wangcai')