在 ES6 中,我们可以使用 Symbol.species 属性来控制可构造函数实例化时所创建的对象类型,默认情况下是构造函数本身的实例。Symbol.species 可以让我们在继承关系中,指定一个子类构造函数来创建实例。
Symbol.species 的作用
Symbol.species 主要用于指定一个构造函数,用于生成从父类继承过来的新的实例对象,从而替换默认的构造函数。通过指定 Symbol.species 属性来创建实例,使得我们不再需要在子类中重复定义原本存在于父类中的方法和行为。
Symbol.species 的使用方法
在父类定义时,我们可以通过指定 Symbol.species,来控制默认的实例化对象类型。例如,下面是一个简单的父类定义:
// javascriptcn.com 代码示例 class Animal { constructor(name) { this.name = name; } static get [Symbol.species]() { return this; } makeSound() {} }
在这个父类中,我们通过静态方法 Symbol.species
来指定默认的实例化对象类型。在这里,我们返回了 this
,它指向的是 Animal。
现在,我们创建一个子类,并继承 Animal。
// javascriptcn.com 代码示例 class Cat extends Animal { constructor(name, furColor) { super(name); this.furColor = furColor; } get species() { return this.constructor[Symbol.species]; } }
在子类中,我们可以通过继承的方法来访问父类的属性和方法。在这里,我们增加了 species 属性,它返回了由 Symbol.species 指定的构造函数。
现在,我们来进行实例化:
const catA = new Cat("Tom", "White"); const catB = catA.species("Tom 2", "Black"); console.log(catB instanceof Cat); // true console.log(catB.makeSound); // function
正如我们所预期的那样,我们实例化的是 Cat,而不是 Animal. 同时,我们还能够继承父类的方法和行为,并在子类中增加新的行为。
Symbol.species 的指导意义
在开发中,继承是非常常见的一种方法。使用 Symbol.species 可以更好地控制继承关系中对象的实例化。在实际开发中,我们可以考虑使用 Symbol.species 来控制对象的类型并继承一些公用方法和行为。
总结
Symbol.species 类属性是 ES6 提供的一种设置实例化类的方式,用于指定子类创建实例对象的构造函数。在继承关系链中使用 Symbol.species 属性时,可以更好地控制实例化对象类型并减少代码冗余。
参考资料
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653f51f27d4982a6eb8dcf3d