乐闻世界logo
搜索文章和话题

手写 javascript 中 new 的实现过程

浏览14
8月5日 12:48

当我们在JavaScript中使用new操作符创建一个新对象时,实际上会发生以下几个步骤:

  1. 创建一个新对象。 使用new操作符时,JavaScript会自动为我们创建一个新的空对象。

  2. 设置原型链。 新对象内部的[[Prototype]](或者__proto__)属性会被赋值为构造函数的prototype属性,这样新对象就可以访问到构造函数原型上的属性和方法。

  3. 绑定this并执行构造函数。 构造函数内部的this将会被绑定到新创建的对象上,然后执行构造函数中的代码,这样新对象就可以具有构造函数中定义的属性和方法。

  4. 返回新对象。 如果构造函数返回的是一个对象,则返回该对象;如果没有返回对象或者返回的不是一个对象,那么将返回步骤1创建的新对象。

如果我们要手写一个new的实现,可以定义一个函数来模拟这个过程。以下是一个例子:

javascript
function myNew(constructor, ...args) { // 步骤1:创建一个空对象,并设置原型链 const obj = Object.create(constructor.prototype); // 步骤2:将构造函数的this绑定到新对象上,并执行构造函数 const result = constructor.apply(obj, args); // 步骤3:根据返回值判断 return result instanceof Object ? result : obj; } // 测试用例 function Person(name, age) { this.name = name; this.age = age; this.sayHello = function() { console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`); }; } // 使用自定义的myNew来替代new操作符 const person = myNew(Person, 'Alice', 30); person.sayHello(); // 输出: Hello, my name is Alice and I am 30 years old.

以上代码中,myNew函数模拟了new操作符的所有关键步骤,能够模拟出通过new操作符创建对象的效果。

标签:JavaScript前端