我想了解如何指定和构建数组。
我正在将数组与其他方法混合,并尝试传递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)
,则最后一个日志也是如此。
还有什么分隔对象数组? 我可以嘲笑吗?
答案 0 :(得分:1)
要模拟一个数组,您必须通过isArray
的内部,该内部具有以下检查(定义为here):
- 如果Type(arg)不是Object,则返回false。
- 如果arg的[[Class]]内部属性的值为“ Array”,则返回true。
- 返回false。
此处的Type
与instanceof
相同,您可以顺利通过。但是,第二步指向一些内部[[Class]]
属性,我不确定我们是否具有写权限。
答案 1 :(得分:0)
我已经得到了所需的东西,但是我仍然没有答案...假数组比常规数组very slower还要多,也许有很多内部优化措施并且模仿它会失去速度。
subclass an array without a class
我的use case