前言
ES6 规范引入了Symbol作为一种新的原始数据类型,用于表示独一无二的值。在 ES6 之后,每个新版本的 ECMAScript 都在 Symbol 上进行了一定的扩展和完善。ECMAScript 2021(以下简称 ES12)是 ECMAScript 的最新版本,其中引入的 Symbol.species
属性可以解决类继承与继承链问题。
Symbol.species属性用途
在 ES6 中,为了使类继承的实现更加规范和易于理解,新的关键字 class
被引入。然而,在使用类继承时,存在一个问题:在一些继承方法被调用时,返回的数据类型可能不是当前类的实例,而是继承类的实例。这就导致了代码的复杂性和不可读性。
ES6 引入了 Symbol.species
属性来解决这个问题。该属性是一个函数,用于返回构造函数在派生类中使用的实例构造器。 允许派生类在它自己的构造函数中精确地指定创建实例的类,并调用之。
示例代码
// javascriptcn.com 代码示例 class MyArray extends Array { static get [Symbol.species]() { return Array; } } const myArray = new MyArray(); const arr = myArray.map((x) => x); console.log(myArray instanceof MyArray); // true console.log(arr instanceof MyArray); // false console.log(arr instanceof Array); // true
在上面的代码中,我们定义了一个派生类 MyArray,继承了内置的 Array 类。如果我们不使用 Symbol.species
属性,那么 MyArray.prototype.map() 将返回一个 Array 类型的实例,而不是 MyArray。这时,我们可以通过设置 Symbol.species
属性,将返回值显示地指定为Array。
总结
ES6 类继承的实现已经相当成熟,ES12的Symbol.species引入使继承类实例的创建更加清晰和规范。它为 JavaScript 提供了更加精细和清晰的类继承模式,并为新的规范和标准做好了铺垫。从长远来看,这个功能具有很大的潜在价值,并将在未来变得更加明显。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652e63957d4982a6ebf6b20a