5分钟搞定new
new一个函数到底干了啥?
在JS中,当new
一个函数后,JS编译器将会做以下四件事情
-
创建一个新的空对象
-
把这个空对象链接到这个函数(构造函数)的原型对象上
-
这个对象被绑定为this
-
如果这个函数不返回任何东西,或者返回的值是除对象外的其它基本类型,那么默认就会
return this
-
如果这个函数返回的是一个对象,那么就会直接返回这个对象,而不会
return this
自己写一个new
/**
* myNew默认第一个参数是一个函数假设为fn,后续的参数作为fn的参数
*/
function myNew() {
if (arguments.length === 0 || typeof arguments[0] !== 'function') {
throw new Error('error: please check your params!!')
}
var _args = Array.from(arguments)
var _constructor = _args.shift()
var _this = Object.create(_constructor.prototype)
var res = _constructor.apply(_this, _args)
// 注意:对于new这个关键字来说,如果你默认在构造函数中不返回任何值,则它会帮你返回构造出的对象。
// 如果你在构造函数中手动的写了返回值,也不是所有的返回值都是原封不动返回的。
// 如果返回的是null、undefined等一些基本类型,则都会返回 new 出来的对象;
// 如果返回的是object,才会把这个object当成返回值返回出去
if (res instanceof Object) {
return res
}
return _this
}
网友评论