Javascript - 请问可以new一个箭头函数吗?

经海路大白狗 2024-07-04 11:35:01 阅读 59

🚐new操作符的步骤

在JavaScript中,<code>new 操作符用于创建一个对象实例,具体来说,它会执行以下几步操作:

创建一个新对象: 创建一个新的空对象,且这个对象的 __proto__ 属性会被设置为构造函数prototype 属性。

设置原型链: 将这个新对象的 __proto__ 属性指向构造函数的 prototype 属性,从而实现新对象继承构造函数的原型方法和属性。

绑定 this 并执行构造函数: 将构造函数中的 this 绑定到这个新对象上,并执行构造函数,传递给构造函数的参数也会传递到此函数中。

返回新对象: 如果构造函数显式地返回一个对象,那么这个对象将作为 new 表达式的结果返回。否则,返回步骤1中创建的新对象。

以下是用代码详细描述这些步骤

function myNew(constructor, ...args) {

// 1. 创建一个新对象

const obj = {};

// 2. 设置原型链

Object.setPrototypeOf(obj, constructor.prototype);

// 3. 绑定 this 并执行构造函数

const result = constructor.apply(obj, args);

// 4. 返回新对象

return result instanceof Object ? result : obj;

}

// 示例构造函数

function Person(name, age) {

this.name = name;

this.age = age;

}

const person = myNew(Person, 'John', 30);

console.log(person.name); // John

console.log(person.age); // 30

让我们一步一步来理解 new 操作符执行的这些步骤:

🤦‍♀️创建一个新对象:

const obj = {};

🤦‍♀️设置原型链:

Object.setPrototypeOf(obj, constructor.prototype);

或者在现代浏览器中可以直接使用:

obj.__proto__ = constructor.prototype;

🤦‍♀️绑定 this 并执行构造函数:

const result = constructor.apply(obj, args);

这里 apply 方法用于将 this 绑定到新创建的对象上,并传递参数给构造函数。

🤦‍♀️返回新对象:

return result instanceof Object ? result : obj;

如果构造函数返回一个对象,则返回该对象;否则,返回新创建的对象。

这种模拟 new 操作符的实现有助于深入理解它的工作原理。总的来说,new 操作符在创建对象的过程中,主要负责设置对象的原型链、执行构造函数以及返回新对象。

🚐那么箭头函数在本小节中又有哪些表现或者特征呢?

ES6引入的箭头函数(Arrow Functions)具有一些独特的特征,使它们在特定场景下比传统函数更加简洁和方便。以下是箭头函数的主要特征:

🤦‍♀️1 没有自己的 this 绑定

箭头函数没有自己的 this 值,它会捕获上下文中的 this 值(即定义时的 this),而不是调用时的 this。这意味着在箭头函数中,this 始终指向它外部作用域的 this

function Person() {

this.age = 0;

setInterval(() => {

this.age++; // `this` 正确指向 Person 对象

console.log(this.age);

}, 1000);

}

const p = new Person();

🤦‍♀️2 没有 arguments 对象

箭头函数没有自己的 arguments 对象。如果需要使用 arguments,可以使用 rest 参数(...args)代替。

const sum = (...args) => args.reduce((a, b) => a + b, 0);

console.log(sum(1, 2, 3)); // 6

🤦‍♀️3 不能用作构造函数

箭头函数不能使用 new 关键字调用,因为它们没有 [[Construct]] 方法,不支持 new 操作符。

const Foo = () => {};

const bar = new Foo(); // TypeError: Foo is not a constructor

🚐总结

由此可见,箭头函数哇,设置原型链 和 绑定 this 并执行构造函数 这两步无法达成,或者说实现不了。

但这完全不影响我们在前端项目中开心的使用箭头函数,你说你没事干new他干啥,面试官你非瞎问这个干啥。直接弄出个项目,你就让他干,考察一下,差不多得了呗,非有的没的瞎问。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。