0
点赞
收藏
分享

微信扫一扫

手写new关键字

Brose 2021-09-28 阅读 40
首先我们要清楚new关键字做了什么事情
1.在内存中创建一个新的空对象。
2.将新对象的对象原型指向构造函数的原型对象。
3.让 this 指向新对象并执行构造函数里面的代码,给这个新对象添加属性和方法。
4. 判断构造函数的返回值,如果是对象类型则返回该对象,否则返回自己创建的对象。

ok,废话不多说,直接上代码

/* 手先写一个简单的构造函数 */
function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.say = function () {
  console.log(this.name);
};
function myNew(fn) {
  /*  首先创建一个空对象,最后会返回这个对象 */
  let myObj = {};

  /* 将新对象的对象原型指向构造函数的原型对象 */
  myObj.__proto__ = fn.prototype;

  /* 接下来需要执行构造函数的代码,并将this指向新创建的对象。arguments是个伪数组,第一个参数是构造函数。
    剩下的参数是需要传入构造函数的参数,经过如下处理,params中存入的是构造函数需要的参数,且是一个真数组
    */
  const params = Array.prototype.slice.call(arguments).splice(1);

  /* 通过apply改变this指向,并执行构造函数获得其执行结果 */
  const res = fn.apply(myObj, params);

  /* 根据构造函数的返回值类型决定返回结果*/
  return res && (typeof result === "object" || typeof result === "function")
    ? res
    : myObj;
}
/* 对比一下new关键字和自己写的myNew */
const p1 = new Person("二牛", 18); //Person { name: '二牛', age: 18 }
const p2 = myNew(Person, "铁柱", 20); // Person { name: '铁柱', age: 20 }
console.log(p1, p2);
p1.say(); // 二牛
p2.say(); // 铁柱
举报

相关推荐

0 条评论