网上看了一些手动实现new操做符的方法和效果,如今来总结下app
function new1(func) { var newObj = Object.create(func.prototype); // 建立一个继承自func.prototype的新对象 var returnObj = func.apply(newObj, Array.prototype.slice.call(arguments, 1)); //截取new1函数第二个以及第二个以后的参数,在newObj做用域内执行改造函数func if ((typeof returnObj === "object" || typeof returnObj === "function") && ret !== null) { return returnObj; } //若是传入参数中的构造函数执行后的returnObj是“对象”类型(好比new1(Object)),那么这个对象会取代newObj做为返回的对象 return newObj; }
function new2(func) { return function() { let newObj = { __proto__: func.prototype // 新生成一个对象,且新对象的原型对象继承自构造对象的原型对象 } var returnObj =func.apply(obj, arguments) // 以第二次执行函数的参数,在obj做用域中执行func if ((typeof returnObj === "object" || typeof returnObj === "function") && returnObj !== null) { return returnObj; } //同理,returnObj是“对象”类型(好比new1(Object)),那么这个对象会取代newObj做为返回的对象 return newObj } }
var object1 = new1(Object); var object2 = new2(Object)(); var object3 = new Object(); console.dir(object1) console.dir(object2) console.dir(object3)
在控制台中查看结果函数
没有区别。
再假定一个自定义的构造函数进行对比this
function person(name, age) { this.name = name this.age = age } var obj1 = new1(person,'zhus',25); var obj2 = new2(person)('zhus',25); var obj3 = new person('zhus',25); console.dir(obj1) console.dir(obj2) console.dir(obj3)
对比结果spa
也没有区别。prototype