javaScript基础面试题 --- new操作符具体做了什么?

文章介绍了JavaScript中new操作符的工作原理,包括创建新对象、设置原型链接和调用构造函数等步骤,并提供了一个名为create的简化实现。通过这个实现,作者阐述了原型链在对象属性查找和继承中的作用。同时,提到了setPrototypeOf和extends在继承中的不同,指出extends是现代且更推荐的继承方式。
摘要由CSDN通过智能技术生成

当我们使用new操作符调用函数时,背后发生了很多事情。这里是简单的new操作符的行为:

  1. 创建一个新的空对象。
  2. 将这个空对象的原型链接到构造函数的prototype对象。
  3. 使用这个新对象作为上下文(即this的值)调用该构造函数。
  4. 如果构造函数返回一个对象,则返回这个对象;否则返回上下文。

现在,让我们尝试写一个简化版本的new操作符,我们称之为create

function create(Constructor, ...args) {
    // 步骤1: 创建一个新的空对象
    const obj = {};

    // 步骤2: 将这个空对象的原型链接到构造函数的`prototype`对象
    Object.setPrototypeOf(obj, Constructor.prototype);

    // 步骤3: 使用这个新对象作为上下文调用该构造函数
    const result = Constructor.apply(obj, args);

    // 步骤4: 如果构造函数返回一个对象,则返回这个对象;否则返回上下文
    return result instanceof Object ? result : obj;
}

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

Person.prototype.sayName = function() {
    console.log(this.name);
};

const person = create(Person, "Alice", 30);
console.log(person.name); // Alice
console.log(person.age);  // 30
person.sayName();         // Alice

这个create函数是new操作符的简化实现,它尝试模仿new的基本行为。然而,要注意,真实的new操作符比这个简化版要复杂得多,处理了更多的边缘情况和特性。但这个简化版本为你提供了一个对new的基本理解。

注意: 这里的Constructor其实是外部传递过来的一个函数参数,是构造函数。将空对象obj的原型链接到Constructor.prototype构造函数的原型上

疑惑:

这个对象的原型链接到构造函数的 prototype上的意义是什么?

当你访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 会查找该对象的原型,看是否有这个属性或方法。将这个对象的原型链接到构造函数的 prototype上意义是实现方法属性的继承。

setPrototypeOf不就是用来实现继承吗?那extends和setPrototypeOf又有什么区别?

功能很像,都用来实现继承
但是setPrototypeOf老旧,extends比较新
extends底层不是使用setPrototypeOf实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值