与普通函数有什么区别?

new的实质是什么?

如何手动写一个new?


首先箭头函数没有prototype, 没有this指向,不可以使用arguments,自然就不能用new,可以理解为没有自己的属性以及作用域

let fa  = (a, b) => {}
console.dir(fa) // ---> 箭头fa函数没有prototype

let fc = function(a, b) {}
console.dir(fc)

//请看下图

另外箭头函数无法使用arguments,而普通函数可以使用arguments。

let fa  = (a, b) => { console.log(arguments) }
console.dir(fa) // --- >没有prototype 没有自己的this指向 不可以使用arguments 不可以new
// fa(1,2) // Uncaught ReferenceError: arguments is not defined

let fc = function(a, b) { console.log(arguments) }
console.dir(fc)
fc(1,2)// Arguments(2) [1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ]

//请看下图

new操作实质上是定义一个具有构造函数内置对象的实例。

  • 创建一个javascript空对象 {};
  • 将要实例化对象的原形链指向该对象原形。
  • 绑定该对象为this的指向
  • 返回该对象。

如何手动写一个new?

 let New = function(fn, ...arg) {
    const obj = Object.create(fn.prototype); // 创建一个对象,将要实例化对象的原形链指向该对象。
    fn.call(obj, ...arg); // 将函数指向该对象。
    return obj;
  };
  
  function fun1() {
    this.name = '?';
  }
  // 打印两者 
  console.log(New(fun1), new fun1()); // fun1 {name: "?"} fun1 {name: "?"}
  // 判断两个实例化对象是否全等。
  console.log(JSON.stringify(New(fun1)) === JSON.stringify(new fun1())); // true

或者

let New = function(fn, …arg) {
const obj = {}; // 创建一个javascript空对象 {};
obj.proto = fn.prototype; // 将要实例化对象的原形链指向该对象原形。
fn.call(obj, …arg); // 绑定该对象为this的指向
return obj; // 返回该对象。
};

发表回复

您的电子邮箱地址不会被公开。