在 ES6 之后,JavaScript 的语言特性得到了大量的扩充,其中一项新增特性就是 Symbol,它可以用来为对象添加唯一的属性。而在 ES7 中,Symbol.species 是一个新增的属性,用来指向一个构造函数,这个构造函数用来创建派生对象的实例。
Symbol.species 的作用
在 ES6 中,使用 Map、Set、Promise 等集合数据类型时,它们的默认构造函数永远都是它们自身。这样在继承时会导致问题,因为继承自一个集合类的子类在实例化时会创建自己的集合实例,而继承自基类的实例却会被创建成父类的实例。这意味着不能使用子类创建一个和父类完全相同,但是继承自子类的新实例。
ES7 中新增的 Symbol.species 属性解决了这一问题。Symbol.species 属性指向一个构造函数,这个构造函数用于衍生对象实例的创建。这个属性可以被集合类型的内建方法,如 Set.prototype.add()、Map.prototype.delete()、Array.prototype.map() 等调用,以保证通过派生类实例调用内建方法时返回的对象类型与派生类实例相同。
Code 案例
-- ---- ----- --- - --- -- -- -- --- -- -------- ----- ----------- ------- ----- - -- -- --- -- ------- -------- - ----- ------ - --- -------------- --- ------ ------- ------ -- --------------- - ------------- - ---------------- ------ ------ ------ - ------ ------- - - -- --------- ----- --------- - --- -------------------- -- -- -------------- ------------ ----- --------- - ----------------- -- - - --- ----------------------- -- ------------------ -- -- -- --- --------------------- ---------- ------------- -- ----
如上所示,使用 Symbol.species 属性重写数组类的 map 方法。不仅保证了返回的类型与派生类实例相同,而且还可以调用派生类的方法,并且继承其它自定义属性和方法。
结论
Symbol.species 的引入使得继承类能够灵活实现集合类,同时保证内建方法返回的类型。它的出现丰富了 JavaScript 的继承模型,为我们在开发中的继承和集合类操作提供了更多的灵活选择。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66f7df74c5c563ced5b00a6b