Пример:
let foo = {bar: 'baz', method() { this.bar = 'baz2' }}
let fooProxy = new Proxy(foo, {set(target, key, val) { console.log('set trap triggered!') }})
fooProxy.bar = 'any value' // as expected: set trap triggered!
foo.method() // trap not triggered
Почему это происходит? Как можно активировать срабатывание ловушки даже изнутри целевого объекта?
Изменить, в основном для того, чтобы объяснить это @Bergi:
Моя основная цель - перехватить любые изменения объекта foo, поэтому я могу установить свойство, например. foo.изменено на true. Кроме того, я хочу перехватывать изменения свойств foo, которые имеют тип массива/объекта. Вы знаете, если я устанавливаю свойство foo, все в порядке, но когда я, например. нажмите на тот, который является массивом, тогда прокси не сможет его перехватить. Поэтому мне также нужно преобразовать свойства массива/объекта в прокси (я назвал их ArrayProxy и ObjectProxy).
Вот мой код (машинопись):
// Category.ts
class Category extends Model {
title: string = ''
products: Product[] = []
}
// Model.ts
abstract class Model extends BaseModel {
constructor() {
return new Proxy(this, {
set (target, key, val) {
if (Array.isArray(val) {
target[key] = new ArrayProxy(val) // I WANT all array properties to be ArrayProxy but the problem (see below) not let me do that
}
}
})
}
}
// BaseModel.ts
abstract class BaseModel {
constructor(attributes) {
this.setAttributes(attributes)
}
setAttributes(attributes) {
Object.keys(attributes).forEach((key) => {
this[key] = attributes[key] // THE PROBLEM
})
}
}
Я удалил код, который не имеет значения (например, аналогичный случай для свойств объекта и ObjectProxy).
Я буду очень признателен, если есть более элегантный способ сделать то, что я сделал.
fooProxy.method()
, конечно. Вы не ожидали бы, чтоfooProxy.method.call(something)
(который устанавливаетsomething.bar
) также активирует прокси? - person Bergi   schedule 04.04.2018const
навязывает кому-то свой личный стиль. - person   schedule 04.04.2018Model
иBaseModel
. Как вы, наверное, заметили,Category
отлично работает в вещах, расширяющихModel
(где конструктор возвращает прокси). - person Bergi   schedule 04.04.2018get
для перехвата любого, кто обращается к свойству объекта/массива. - person Bergi   schedule 04.04.2018