new 的模拟实现

105 阅读1分钟

new

new运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一

new 的实现

  • 创建一个新对象
  • 将构造函数作用域赋值一个新对象,this指向这个新对象
  • 执行构造函数中的代码(为这个函数添加新属性)
  • 返回新对象
function objectFactory() {
    // 创建一个新对象
    var obj = new Object()
    // 获取构造函数,arguments的第一个参数,因为arguments是类数组不是真正的数组,所以需要call
    Contructor = [].shift.call(arguments)
    // 链接到原型,obj可以访问构造函数原型中的属性
    obj._proto_ = Contructor.prototype
    // 绑定this实现继承,obj可以访问构造函数中的属性
    var res = Constructor.apply(obj, argument)
    // 有限返回构造函数返回的对象
    return typeof res === 'object' ? res : obj
}

其实new Person()里面干了下面几件事情

  • 创建了一个空的JS对象
  • 把空对象的原型链上级设置成Person的的原型函数
  • 跟换this调用
  • 返回obj
function create() {
    var obj = new Object()
    obj._proto_ = Person.prototype
    Person.call(obj)
    return obj
}