js进阶之new的实现

51 阅读1分钟
function Fn(name,age) { 
  this.name = name;
  this.age = age;
}

Fn.prototype.sayName = function () { 
  console.log(this.name)
}

let obj = new Fn('jack', 21)

console.log(obj.name, obj.age)

obj.sayName()

new 关键字做的事情:

  1. 返回新创建的对象实例obj
  2. 向构造函数传参并执行
  3. 构造函数中的this指向obj
  4. obj可以访问构造函数原型对象上的属性和方法

由于new是一个关键字,我们用一个方法来模拟实现它

function factoryNew() { 
  let obj = new Object();
  let constructor = Array.prototype.shift.call(arguments)
  // obj可以访问构造函数原型对象
  obj.__proto__ = constructor.prototype
  // 构造函数this指向obj
  constructor.apply(obj, arguments)
  return obj
}

let obj2 = factoryNew(Fn,'jack', 21)
console.log(obj2.name, obj2.age)

obj2.sayName()