在 ES7 中,新增了 Array.prototype [Symbol.species] 属性,该属性是一个可选的、用于指定创建派生对象的构造函数的 Symbol 值。该属性的引入为开发者提供了更加灵活的创建派生对象的方式。
Symbol.species 的作用
在 ES6 中,数组的 map、filter、slice 等方法都会返回一个新的数组对象,这个新的数组对象与原数组对象具有相同的构造函数,即都是 Array。这样做的好处是保证了代码的可读性和可维护性,同时也避免了一些潜在的问题。
但是,在某些情况下,我们希望返回的新的数组对象不是 Array,而是另一个派生自 Array 的子类。在这种情况下,我们就可以使用 Symbol.species 属性来指定构造函数,创建一个派生自原数组的新数组对象。
Symbol.species 的用法
Symbol.species 属性是一个可选的、用于指定创建派生对象的构造函数的 Symbol 值。该属性的默认值为当前对象的构造函数,即 Array。
下面是一个使用 Symbol.species 属性的示例代码:
-- -------------------- ---- ------- ----- ------- ------- ----- - ------ --- ------------------ - ------ ------ - - ----- ------- - --- ---------- -- --- ----- -------- - ------------- -- - - --- -------------------- ---------- --------- -- ----- -------------------- ---------- ------- -- ----
上面的代码中,我们定义了一个 MyArray 类,继承自 Array。在 MyArray 类中,我们重写了 [Symbol.species] 属性的 getter 方法,返回了 Array 构造函数。然后我们创建了一个 MyArray 对象 myArray,并调用它的 map 方法,将每个元素都乘以 2,返回一个新的数组对象 newArray。
由于我们在 MyArray 中指定了 [Symbol.species] 属性的值为 Array,因此 newArray 的构造函数是 Array 而不是 MyArray。因此,newArray instanceof MyArray 的结果为 false,而 newArray instanceof Array 的结果为 true。
Symbol.species 的指导意义
Symbol.species 属性的引入为开发者提供了更加灵活的创建派生对象的方式。在某些情况下,我们希望返回的新的数组对象不是 Array,而是另一个派生自 Array 的子类。在这种情况下,我们可以使用 Symbol.species 属性来指定构造函数,创建一个派生自原数组的新数组对象。
同时,Symbol.species 属性的引入也提醒我们,在使用 Array 的 map、filter、slice 等方法时,要注意返回的新数组对象的构造函数,以免出现潜在的问题。
总结
ES7 中新增的 Array.prototype [Symbol.species] 属性为开发者提供了更加灵活的创建派生对象的方式。在某些情况下,我们可以使用 Symbol.species 属性来指定构造函数,创建一个派生自原数组的新数组对象。同时,Symbol.species 属性的引入也提醒我们,在使用 Array 的 map、filter、slice 等方法时,要注意返回的新数组对象的构造函数,以免出现潜在的问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/662a0a44c9431a720c7a09b0