hi,大家好,我是一条狗。
function Dog() {}
var you = new Dog()
new 做了4件事:
function myNew(cons, ...args) {
// A:创建一个新对象tempObj
var tempObj = {}
// B:把cons的prototype接到tempObj的原型链上
tempObj = Object.create(cons.prototype)
// C: 这一步有两个功能
// 1、在tempObj的上下文环境中执行cons
// 2、返回一个带着cons上下文的tempObj
cons.apply(tempObj, args)
// D: 返回新对象
return tempObj
}
// 更具包容性的参数处理方式:
function myNew() {
var tempObj = Object.create(arguments[0].prototype)
var arg = Array.prototype.slice.call(arguments, 1) // 切掉数组第一个成员
arguments[0].apply(tempObj, arg)
return tempObj
}
其实 tempObj = Object.create(cons.prototype) 可以理解为:
tempObj.constructor = cons
tempObj.__proto__ = cons.prototype
但这只是帮助我从原型链的角度去理解 Object.create() 的工作,MDN上说不建议修改对象的 __proto__ 值,因为性能很差。