模拟new运算符

111 阅读1分钟

总结特点

- 通过new运算符和构造函数(用Constructor代替) 创建并返回一个引用值
    - 若构造函数返回的是引用值(null是历史遗留问题 typeof null === 'object'),则返回的
      该引用值
    - 反之,返回的Object,该对象通过Constructor来初始化属性,并且它的__proto__属性指向
      Constructor.prototype

代码实现

  // 3 4 步骤可以互换
function objectFactory() {

  // 1. 通过Objec构造函数创建一个对象
  var obj = new Object()

  // 2. 获取构造函数,因为是通过objectFactory函数来模拟new的功能,因此第一个参数就是构造函数
  var Constructor = Array.prototype.shift.call(arguments)

  // 3. 改变构造函数内部的this,并调用该函数
  var res = Constructor.apply(obj,arguments)

  // 4. new创建的实例对象,能访问构造函数的原型
  obj.__proto__ = Constructor.prototype

  // 5. 构造函数返回的是Object | Array | Function,则实例对象为此引用值;否则为上面的obj
  return res ? (typeof(res) === 'object' | typeof(res) === 'function' ? res : obj) : obj
}

demo.prototype.Name = 'demo-prototype'
function demo(name,age) {
  this.name = name
  this.age = age

  // 1. 返回 object
  // return {
  //   school: 'my-school',
  // }
  
  // 2. 返回 array
  // return [1,2,3]

  // 3. 返回 null , 原始值
  // return null
  // return undefined
  // return '原始值'

  // 4. 返回 function
  // return function func(){}
}

var d1 = new demo('d1',20)
var d2 = objectFactory(demo,'d2',18)
console.log(d1,d2)
console.log(d1.Name,d2.Name)