new都干了啥

function MyNew() {
  var object = new Object(); // 1生成一个实例对象
  var constructor = [].shift.call(arguments); // 取到构造函数
  var args = arguments; // 渠道构造函数的参数
  object.__proto__ = constructor.prototype; // 2给实例对象绑定原型
  constructor.apply(object, args); // 3给实例对象绑定内部属性/方法
  return object; // 4返回实例对象
}
function Person(name, age) {
  this.name = age;
  this.aget = age;
}

var person = MyNew(Person, "Tom", 20);

person.name => "Tom"
person.age => 20
person instanceof Person => true
person.constructor === Person => true

new 的过程其实主要分成四步

  1. 生成一个空对象实例
  2. 给实例绑定原型
  3. 给实例赋予构造函数的属性/方法
  4. 返回这个实例对象

看到别人解释,感觉也是对的(出处我就不知道了)

function myNew() {
  var constructor = [].shift.call(arguments); // 取得构造函数
  var args = arguments; // 取得参数
   var object = Object.create(constructor.prototype); // 1创建一个原型是构造函数的对象
   constructor.apply(object, args); // 2将对象和参数放到放回构造函数中执行
  return object   // 3返回对象         
}

 

  

涉及到的知识

  1. new 都干了啥
  2. arguments属于类数组对象,除了length和索引值之外没有Array的其他属性
  3. call和apply可以转换函数内的上下文this
  4. 构造函数会有个原型,用构造函数的prototype属性指向它
  5. 实例对象的__proto__ 会指向 构造函数的原型
posted @ 2020-11-02 21:53  zctest  阅读(40)  评论(0)    收藏  举报