function myNew(){
var obj = {}
var constructorFunction = [].shift.call(arguments) // 拿到构造函数,因为构造函数是第一个参数,arguments里面的其余的参数就是构造函数的参数
var params = arguments // 此时的arguments已经是去掉了第一个参数的arguments
var res = constructorFunction.apply(obj, params) // 这句是改变constructorFunction的this指向到obj并且执行constructorFunction这个函数
return res instanceof Object ? res : obj
}
代码第二行的,“构造函数是第一个参数”,使用new的时候,并没有把构造函数放在括号内进行传参吧?
比如,通过
function
的形式定义了一个构造函数MyClass
(如果用class
语法来定义,里面的constructorFunction.apply
会报错),那么用myNew
来生成对像就是myNew(MyClass, 后面是构造参数)
。上面的示例在myNew
里的执行过程如下面注释从代码来看,应该是比较旧的 JavaScript 语法了,学习的时候可以用来理解
Function.prototype.apply
、Function.prototype.call
,以及生成对象的过程,但在实际开发中一般没多大用。实际开发建议使用class
语法。