手动实现new函数

74 阅读1分钟
function Car(make, model, year) {
    this.make = make;
    this.model = model;
    this.year = year;
    // return {
    //     a: 1
    // }
  }
  Car.prototype.getYear = function() {}

  function manualnew(contructor) {
    // if (typeof contructor !== 'function') {
    //     return;
    // }
    console.log(arguments)
    var args = Array.prototype.slice.call(arguments, 1)
    console.log(args)
    var obj = {}
    obj.__proto__ = contructor.prototype; // 这步只搞到了构造函数原型上的方法, 那如何搞到构造函数的属性呢
    contructor.apply(obj, args) // 这步是搞属性的 // 这里call和apply还不一样呢 这里用了apply是因为上面将arguments这个累数组对象转化为数组对象, 所以用apply
    // 如果构造函数没有return 那就把这个obj返回
    var contructores = contructor.apply(obj, args) // 这个为什么能取到构造函数的return呢???
    console.log('contructores', contructores)
    return contructores ? contructores : obj;
  }
  var s = manualnew(Car, 'a', 'b', 1234)
  console.log('s :',s)