学习 new 操作符

75 阅读1分钟

基本使用

function Test(name) {
  this.name = name;
  return 1;
}
const t = new Test('yck');
console.log(t.name); // 'yck'

自己实现

new 返回了一个对象,然后我们通过这个对象可以访问到 原型的任意属性

function Test(name) {
  this.name = name;
}
Test.prototype.sayName = function () {
  console.log(this.name);
};
// const t = new Test('yck');
const t = createNew(Test, 'yck');
console.log(t.name);
t.sayName();

function createNew(fn, ...args) {
  let obj = {};
  // 把 fn 的原型复制到 obj上
  Object.setPrototypeOf(obj, fn.prototype);
  // 把obj绑定到构造函数上,传入参数
  let res = fn.bind(obj)(...args);
  // let res = fn.call(obj, ...args);
  // let res = fn.apply(obj, args);
  console.log(res);
  // 判断构造函数返回值是否为对象,如果为对象就使用构造函数返回的值,否则使用 obj,这样就实现了忽略构造函数返回的原始值
  return res instanceof Object ? res : obj;
}