diff --git a/src/proxy.js b/src/proxy.js
index <HASH>..<HASH> 100644
--- a/src/proxy.js
+++ b/src/proxy.js
@@ -150,15 +150,13 @@ function deleteProperty(state, prop) {
 }
 
 function getOwnPropertyDescriptor(state, prop) {
-    const owner = state.modified
-        ? state.copy
-        : has(state.drafts, prop)
-        ? state.drafts
-        : state.base
-    const descriptor = Reflect.getOwnPropertyDescriptor(owner, prop)
-    if (descriptor && !(Array.isArray(owner) && prop === "length"))
-        descriptor.configurable = true
-    return descriptor
+    const owner = source(state)
+    const desc = Reflect.getOwnPropertyDescriptor(owner, prop)
+    if (desc) {
+        desc.writable = true
+        desc.configurable = !Array.isArray(owner) || prop !== "length"
+    }
+    return desc
 }
 
 function markChanged(state) {
fix: property descriptor edge cases

Using the `drafts` object as a source of property descriptors is bad,
because enumerability is not preserved by the `drafts` object.

Thus, we must use `state.base` when `state.copy` is undefined, which
means we need to ensure the property descriptor has a `writable` value
of true. Otherwise, the descriptor would be lying.