如何确保构造函数只能被 new 而不能被普通调用

100 阅读2分钟

在JavaScript中,构造函数通常用于创建对象,而new关键字用于调用这些构造函数以创建实例。然而,有时可能需要确保你的构造函数只能通过new来调用,而不能被普通函数调用。本文将介绍如何实现这一目标,以确保构造函数的正确使用。

问题描述

首先看为什么需要这样的保护:当创建一个构造函数并希望它只能被new调用时,这是因为构造函数通常执行一些对象初始化和配置的操作,如果被普通函数调用,它可能会对全局对象或其他上下文产生不良影响,这种问题可能导致难以追踪的错误。

解决方法

为了确保你的构造函数只能通过new来调用,可以采取以下方法:

方法一:使用构造函数内部的检查


function MyConstructor() {

  // 检查是否使用了new关键字

  if (!(this instanceof MyConstructor)) {

    throw new Error('MyConstructor must be called with new.');

  }

 

  // 构造函数的实际逻辑

  this.property = 'some value';

}

这种方法会检查this是否是MyConstructor的实例。如果不是,它会抛出一个错误。这样,如果有人尝试通过MyConstructor()而不是new MyConstructor()来调用构造函数,将会得到错误提示。

方法二:使用类(ES6)

在ES6中,你可以使用类来定义构造函数,它会自动检查并要求使用new来调用:


class MyClass {

  constructor() {

    if (new.target === undefined) {

      throw new Error('MyClass must be called with new.');

    }

    this.property = 'some value';

  }

}

这里,new.target是一个元属性,它会在构造函数内部指向调用构造函数的构造器。如果没有通过new来调用构造函数,new.target将为undefined,从而触发错误。

使用示例

下面是如何使用上述方法:


const instance1 = new MyConstructor(); // 正确的调用方式

const instance2 = new MyConstructor(); // 正确的调用方式

const instance3 = MyConstructor(); // 错误,会抛出异常

  


const obj1 = new MyClass(); // 正确的调用方式

const obj2 = MyClass(); // 错误,会抛出异常

总结

确保构造函数只能通过new调用是一种良好的编码实践,可以避免潜在的错误和问题。通过在构造函数内部进行相应的检查,可以更好地保护你的代码免受误用。不管选择哪种方法,这种约束将有助于维护代码的完整性和可靠性。

希望本文对您有所帮助!