Page 224 - 你不知道的JavaScript(下卷)
P. 224

var a = Array( 3 );
                     a.length;                       // 3
                     a[0];                           // undefined

                     var b = Array.of( 3 );
                     b.length;                       // 1
                     b[0];                           // 3

                     var c = Array.of( 1, 2, 3 );
                     c.length;                       // 3
                     c;                              // [1,2,3]

                 什么情况下你会需要使用 Array.of(..) 而不是只用 c = [1,2,3] 这样的字面值语法创建一
                 个数组呢?有两种可能的情况。

                 如果你有一个回调函数需要传入的参数封装为数组,Array.of(..) 可以完美解决这个需
                 求。这样的用法不是很常见,但是可能恰好“解了你的痒”。

                 另外一种情况是,如果你构建 Array 的子类(参见 3.4 节),并且想要在你的子类实例中创
                 建和初始化元素,比如:

                     class MyCoolArray extends Array {
                         sum() {
                             return this.reduce( function reducer(acc,curr){
                                 return acc + curr;
                             }, 0 );
                         }
                     }

                     var x = new MyCoolArray( 3 );
                     x.length;                      // 3--oops!
                     x.sum();                       // 0--oops!

                     var y = [3];                   // Array, 而不是MyCoolArray
                     y.length;                      // 1
                     y.sum();                       // sum不是一个函数

                     var z = MyCoolArray.of( 3 );
                     z.length;                      // 1
                     z.sum();                       // 3

                 你不能(简单地)只是为 MyCoolArray 创建一个构造器来覆盖 Array 父构造器的行为,
                 因为那个构造器对于实际构造一个行为符合规范的数组值(初始化 this)是必要的。
                 MyCoolArray 子类“继承来的”静态 of(..) 方法提供了很好的解决方案。


                 6.1.2 静态函数 Array.from(..)
                 JavaScript 中的“类(似)数组对象”是指一个有 length 属性,具体说是大于等于 0 的整
                 数值的对象。


                                                                              新增 API   |   201

                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   219   220   221   222   223   224   225   226   227   228   229