JS中new关键字的探索与联想
非常好的参考资料
https://github.com/mqyqingfeng/Blog/issues/13
https://juejin.im/post/59c9bc855188254f58413aa0
原理主要是:用new关键字创造的实例,有构造函数中的属性和方法,也有构造函数原型上的属性和方法,所以我们写一个函数来实现这个功能,设想如果用new关键去创建对象的时候是怎么写的?
```
var obj = new Ctor()
```
那么我们用一个函数来代替new关键字,使用的时候可以这样写:
```
var obj = mockNew(Ctor)
```
下面就看一下如何实现这个mockNew
```
function mockNew() {
var Constructor = [].shift.call(arguments)
var obj = Object.create(Constructor.prototype)
var ret = Constructor.apply(obj, arguments)
return obj
}
```
函数实现后,我们看下如何调用:
```
function mockNew() {
var Constructor = [].shift.call(arguments)
var obj = Object.create(Constructor.prototype) //这条语句可以实现构造函数原型上的属性和方法继承给了实例对象
var ret = Constructor.apply(obj, arguments) //这条语句可以实现把构造函数上的私有属性和方法变成实例对象的私有属性和方法
return obj
}
function Fn(name) {
this.name = name
}
Fn.prototype.sayHello = function () {
console.log('Hello, ', this.name);
}
var obj = mockNew(Fn, 'lily')
console.log('===', obj);
```
上面这样写,还不够完美,如果构造函数有返回值会怎么样?如果返回值是引用类型,会怎么样?是基本数据类型,又会怎么样?我们可以做个试验,看看构造函数返回引用类型会怎么样:
```
function Fn(name) {
this.name = n