使用new调用函数会执行以下操作
- 创建一个全新的对象
- 这个新对象会被执行[[Prototype]]连接
- 这个新对象会绑定到函数调用的this
- 如果函数没有返回其他对象,那么表达式中的函数调用会自动返回这个新对象为
实现代码
/**
* 实现 new 运算符
*/
function myNew (func) {
// 创建一个全新的对象,执行原型连接
var o = Object.create(func.prototype)
// 这个新对象会绑定到函数调用的this
var k = func.call(o)
// 如果函数没有返回其他对象,那么表达式中的函数调用会自动返回这个新对象为
if (typeof k === 'object') {
return k
} else {
return o
}
}
Object.create 创建一个新的对象 文档
Object.create
是创建对象的一种方式,Object.create
会创建一个新对象,并把新对象的原型指向第一个参数,所以用Object.create
创建的对象满足new
操作符的前两点操作。
绑定调用函数的this到新对象去
使用Function.prototype.call()
将传进来的函数的this
指向新创建的对象,在函数对象调用call
方法的同时,会将函数执行。用apply
也是可以的。