手写new操作符时,表达式Array.prototype.shift.call(arguments) 是否可以通过argument[0]代替?

作者站长头像
站长
· 阅读数 6

我感觉获取第一个参数作为构造函数,arguments[0]就能满足需求,为什么要用shift弹出第一个元素呢?我看了好几个代码要么是 Array.prototype.shift.call(arguments) 要么是[].shift.call(arguments); 不太清楚为什么要这样做。

回复
1个回答
avatar
test
2024-06-27

用 Array.prototype.shift.call(arguments) 的方式更方便获取构造函数的参数,用arguments[0]:这种方式只是获取第一个参数,不会改变 arguments 对象。你用这种方式的话,你还要手动创建一个新的参数数组,这个数组里不包含第一个参数,然后把它再传给构造函数。可以看下面的实现:

function myNew() {
  var Constructor = Array.prototype.shift.call(arguments);
  
  var obj = Object.create(Constructor.prototype);
  
  var result = Constructor.apply(obj, arguments);
  
  return result instanceof Object ? result : obj;
}

function Person(name, age) {
  this.name = name;
  this.age = age;
}

var person = myNew(Person, 'Alice', 25);
console.log(person.name); // 输出: Alice
console.log(person.age);  // 输出: 25
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容