一、new做了什么
1.创建了一个全新的对象。
2.这个对象会被执行[[Prototype]](也就是__proto__)链接。
3.生成的新对象会绑定到函数调用的this。
4.通过new创建的每个对象将最终被[[Prototype]]链接到这个函数的prototype对象上。
5.如果函数没有返回对象类型Object(包含Functoin, Array, Date, RegExg, Error),那么new表达式中的函数调用会自动返回这个新的对象。
<!-- 解释2 先理清楚 new 关键字调用函数都的具体过程,那么写出来就很清楚了 首先创建一个空的对象,空对象的__proto__属性指向构造函数的原型对象 把上面创建的空对象赋值构造函数内部的this,用构造函数内部的方法修改空对象 如果构造函数返回一个非基本类型的值,则返回这个值,否则上面创建的对象 -->
<script type="text/javascript"> function newOperator(ctor){ if(typeof ctor !== 'function'){ throw 'newOperator function the first param must be a function'; } newOperator.target = ctor; var newObj = Object.create(ctor.prototype); var argsArr = [].slice.call(arguments, 1); var ctorReturnResult = ctor.apply(newObj, argsArr); var isObject = typeof ctorReturnResult === 'object' && ctorReturnResult !== null; var isFunction = typeof ctorReturnResult === 'function'; if(isObject || isFunction){ return ctorReturnResult; } return newObj; } // es6版本 function _new(fn, ...arg) { const obj = Object.create(fn.prototype); const ret = fn.apply(obj, arg); return ret instanceof Object ? ret : obj; } function Student (){ this.name = '1' } Student.prototype.sayName = func let student = _new(Student) console.log(student.__proto__ === Student.prototype) //实例的__proto指向构造函数的原型 </script>