如何模仿JavaScript中的数组?

时间:2019-01-05 14:31:07

标签: javascript arrays mocking

我想了解如何指定和构建数组。

我正在将数组与其他方法混合,并尝试传递Array.isArray()。我可以通过instanceof和充满填充的isArray

var protoOfArray = Object.getPrototypeOf([])

var tools4Arrays = Object.defineProperty(
  Object.create(protoOfArray),
  'sum', {
    'value': function sum() {
      return this.reduce((a, b) => a + b, 0)
    }
  }
)
tools4Arrays[Symbol.toStringTag] = 'Array'

var fakeArray = Object.defineProperty(
  Object.create(
    tools4Arrays
  ),
  'length', {
    'value': 0,
    'writable': true
  }
)

console.log(`fakeArray instanceof Array: ${fakeArray instanceof Array}`)
console.log(`polyfill.isArray(fakeArray): ${Object.prototype.toString.call(fakeArray) === '[object Array]'}`)
console.log(`Array.isArray(fakeArray): ${Array.isArray(fakeArray)}`)

如果我使用:fakeArray = Object.setPrototypeOf([], tools4Arrays),则最后一个日志也是如此。

还有什么分隔对象数组? 我可以嘲笑吗?

2 个答案:

答案 0 :(得分:1)

要模拟一个数组,您必须通过isArray的内部,该内部具有以下检查(定义为here):

  
      
  1. 如果Type(arg)不是Object,则返回false。
  2.   
  3. 如果arg的[[Class]]内部属性的值为“ Array”,则返回true。
  4.   
  5. 返回false。
  6.   

此处的Typeinstanceof相同,您可以顺利通过。但是,第二步指向一些内部[[Class]]属性,我不确定我们是否具有写权限。

答案 1 :(得分:0)

我已经得到了所需的东西,但是我仍然没有答案...假数组比常规数组very slower还要多,也许有很多内部优化措施并且模仿它会失去速度。

subclass an array without a class

我的use case