js手写new

101 阅读1分钟

要实现new关键字的功能,可以按照以下步骤进行:

  1. 创建一个空对象,作为要实例化的构造函数的实例。
  2. 将构造函数的原型赋值给新创建的对象的__proto__属性,以便新对象可以访问构造函数的原型方法。
  3. 使用apply方法调用构造函数,并将新创建的对象作为this值传递给构造函数。
  4. 如果构造函数返回一个对象,则返回该对象;否则,返回新创建的对象。

下面是一个简单的示例代码,演示了如何使用JavaScript实现new关键字:

function myNew(constructor, ...args) {
  // 创建一个空对象
  const obj = {};

  // 将构造函数的原型赋值给新对象的__proto__属性
  obj.__proto__ = constructor.prototype;

  // 使用apply调用构造函数,并传递新对象作为this值
  const result = constructor.apply(obj, args);

  // 如果构造函数返回一个对象,则返回该对象;否则返回新对象
  return typeof result === "object" && result !== null ? result : obj;
}

使用上述自定义的myNew函数,可以模拟new关键字的行为。例如:

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

Person.prototype.sayHello = function () {
  console.log(`Hello, my name is ${this.name}`);
};

const person = myNew(Person, "John", 25);
person.sayHello(); // 输出: Hello, my name is John
console.log(person.age); // 输出: 25

在上面的示例中,我们定义了一个Person构造函数,并将其原型上添加了一个sayHello方法。然后,使用myNew函数创建了一个person对象,传递了构造函数的参数。最后,我们可以通过person对象调用构造函数原型上的方法,并访问对象的属性。