Я экспериментировал с некоторыми фрагментами кода ниже, и все, кажется, работает как ожидалось.Цель состояла в том, чтобы связать a.val
с b.val
таким образом, чтобы при изменении a.val
значение b.val
также автоматически менялось.
// instantiate
var a = {}
var b = {}
// set value
a.val = 10
// check values
console.log("A.val is:", a.val) // 10
console.log("B.val is:", b.val) // undefined
// bind values
Object.defineProperties(a, {
val: {
configurable: true, // can be changed or deleted
enumerable: true, // can be iterated over
get: ()=> this.val,
set: (value)=> {
this.val = value
b.val = value
return value
}
}
})
// reset value
a.val = 20
// check values
console.log("A.val is:", a.val) // 20
console.log("B.val is:", b.val) // 20
Поэтому я хотел двигаться дальше с этой концепцией и абстрагировать Object.defineProperties
часть в функции.Я думал, что смогу сделать цикл for и просмотреть свойства одного объекта, вызвать Object.defineProperty
.Но я столкнулся с некоторыми проблемами:
function getSet(props){
for(var key in props){
Object.defineProperty(props, key, {
configurable: true, // can be changed or deleted
enumerable: true, // can be iterated over
get: ()=> this[key],
set: (value)=> {
this[key] = value
return value
}
})
}
return props
}
var a = getSet({name: 'the letter a', age: 12})
a.name // undefined
a.name = 'the letter a'
a.age // 'the letter a'
По сути, я случайно связал два свойства объекта, который я передавал, функции getSet
.Кроме того, я стер их начальные значения.
Мой вопрос: почему это происходит, и как мне приблизиться к моей цели - связать свойства одного объекта с другим.
В ходе тестирования нескольких других возможных решений я столкнулся с ошибкой Maximum call stack size exceeded
: я полагаю, что при ссылке на this
в методе получения или установки, действие по получению значения из объекта, для которого я пытаюсь определить свойствазапускает вызов к получателю и циклически повторяется.Не совсем уверен, когда и почему это произойдет.