Как имитировать массивы в JavaScript? - PullRequest
0 голосов
/ 05 января 2019

Я хотел бы понять, как массивы определяются и создаются.

Я смешиваю массивы с дополнительными методами и пытаюсь передать 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 голосов
/ 07 января 2019

Я получил то, что мне было нужно, но у меня все еще нет ответа ... Поддельный массив очень медленнее , чем обычный массив, возможно, имеет много внутренних оптимизаций и имитирует, что он потеряет эту скорость.

подкласс массива без класса

мой вариант использования

0 голосов
/ 05 января 2019

Для того, чтобы имитировать массив, вам нужно будет пройти внутреннюю часть isArray, которая имеет следующие проверки (определены здесь ):

  1. Если тип (arg) не является объектом, вернуть false.
  2. Если значение внутреннего свойства [[Class]] для arg равно "Array", вернуть true.
  3. Вернуть ложь.

Здесь Type похоже на то же самое, что и instanceof, который вы смогли пройти очень хорошо. Однако второй шаг указывает на некоторое внутреннее свойство [[Class]], к которому я не уверен, что у нас есть доступ для записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...