Как прокси JavaScript создание примитива - PullRequest
1 голос
/ 25 февраля 2020

Я хочу что-то сделать при создании строки, например:

String = new Proxy(String, {
    construct: (t, a) => {
        return { a: 123 }
    }
})
console.log(new String('q')) // { a: 123 }

Однако, если вы используете примитивы, это не сработает.

String = new Proxy(String, {
    construct: (t, a) => {
        return { a: 123 }
    }
})
console.log('1') // Expected: { a: 123 }, Actual: 1

Есть ли Кстати?

тогда второй вопрос, когда среда выполнения преобразует примитивы, могу ли я прокси процесс?

var a = '123' // This is a primitive
console.log('123'.substring(0,1)) // Actual: 1
// The runtime wraps the primitive as a String object.
// then uses a substring, and then returns the primitive.

сейчас:

String = new Proxy(String, {
    construct: (t, a) => {
        return { a: 123 }
    },
    apply: (target, object, args) => {
        return { a: 123 }
    }
})
console.log('1'.a) // Expected: 123 , Actual: undefined

Я знаю, что могу добавьте 'a' к прототипу String для достижения ожидаемых результатов.

Но я хочу иметь возможность прокси-доступа к произвольным атрибутам для примитивов. ('1'.*, не JSUT '1'.a)

Есть ли способ?

Спасибо за ваш ответ.

1 Ответ

1 голос
/ 25 февраля 2020

Нет, это невозможно. Прокси работают только на объектах, а не на примитивах. И нет, вы не можете перехватить внутренний (и оптимизированный) процесс, который преобразует примитив в объект для доступа к свойствам (включая методы) в нем.

Некоторые операции с примитивами действительно используют методы String.prototype / Number.prototype / Boolean.prototype, и вы можете перезаписать эти методы, если решитесь, но вы не можете заменить весь объект-прототип для прокси.

...