diff --git a/packages/alpinejs/src/scope.js b/packages/alpinejs/src/scope.js index 3541360f0..abceae667 100644 --- a/packages/alpinejs/src/scope.js +++ b/packages/alpinejs/src/scope.js @@ -55,6 +55,11 @@ export function mergeProxies(objects) { return (objects.find(obj => { if (obj.hasOwnProperty(name)) { let descriptor = Object.getOwnPropertyDescriptor(obj, name) + + // If we already bound this getter, don't rebind. + if ((descriptor.get && descriptor.get._x_alreadyBound) || (descriptor.set && descriptor.set._x_alreadyBound)) { + return true + } // Properly bind getters and setters to this wrapper Proxy. if ((descriptor.get || descriptor.set) && descriptor.enumerable) { @@ -63,10 +68,16 @@ export function mergeProxies(objects) { let setter = descriptor.set let property = descriptor + getter = getter && getter.bind(thisProxy) + setter = setter && setter.bind(thisProxy) + + if (getter) getter._x_alreadyBound = true + if (setter) setter._x_alreadyBound = true + Object.defineProperty(obj, name, { ...property, - get: getter && getter.bind(thisProxy), - set: setter && setter.bind(thisProxy), + get: getter, + set: setter, }) }