【问题标题】:How to mimic arrays in javascript?如何在javascript中模拟数组?
【发布时间】:2019-01-05 14:31:07
【问题描述】:

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

我正在将数组与额外的方法混合并尝试传入Array.isArray()。我可以通过instanceof 和Poly-filled 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) 最后的日志也是真的。

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

【问题讨论】:

  • 你的意思是还有什么可以将数组对象分开?或者你是在问一些关于包含对象的数组的具体问题吗?
  • @joe:这与对象数组无关。我可以从对象构建数组编辑吗?什么转换需要在常规对象上构造一个数组?我的 fakeArray 不通过 Array.isArray()。我如何靠近?这种转变可能吗?还是数组不能从对象中约简?

标签: javascript arrays mocking


【解决方案1】:

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

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

这里的Type 似乎与instanceof 相同,您可以顺利通过。但是,第二步指向一些内部 [[Class]] 属性,我不确定我们是否具有写入权限。

【讨论】:

【解决方案2】:

我得到了我需要的东西,但我仍然没有答案......一个假数组是very slower而不是一个常规数组,可能有很多内部优化并且模仿它会失去那个速度。

subclass an array without a class

我的use case

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多