{"record":{"id":"8092ab71e7ca3a0d","repo":"dianping/cat","slug":"getters-setters-can-not-be-defined-on-this-javas","errorCode":null,"errorMessage":"getters & setters can not be defined on this javascript engine","messagePattern":"getters & setters can not be defined on this javascript engine","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"cat-home/src/main/webapp/assets/js/editor/worker-xquery.js","lineNumber":49353,"sourceCode":"            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}","sourceCodeStart":49335,"sourceCodeEnd":49371,"githubUrl":"https://github.com/dianping/cat/blob/e815e74d4c2dd74edac831241f1253fcc7d25381/cat-home/src/main/webapp/assets/js/editor/worker-xquery.js#L49335-L49371","documentation":"The es5-shim defineProperty fallback cannot emulate accessor properties (get/set) on engines that lack __defineGetter__/__defineSetter__ (notably IE7/IE8 and some embedded JS runtimes). When a descriptor has get or set and no value, and supportsAccessors is false, it throws this TypeError because there is no correct way to honor the descriptor. This is a capability limitation, not a caller-type mistake.","triggerScenarios":"Object.defineProperty(obj, 'p', {get: function(){...}}) executed on an engine where the shim's feature detection (supportsAccessors) found no __defineGetter__/__defineSetter__ and no working native defineProperty. In this codebase that means the XQuery editor web worker running in a pre-ES5 browser.","commonSituations":"Legacy IE support matrices; embedded JS engines (old Rhino, some webviews) without accessor support; a library that uses read-only computed properties via getters being loaded into such an environment.","solutions":["Replace the accessor descriptor with a plain value descriptor (compute the value eagerly) or a normal method: obj.getValue().","If read-only semantics are needed, use {writable: false, value: v} which the shim can emulate with plain assignment.","Upgrade the target browser/runtime — on any engine with native defineProperty or __defineGetter__ this path is never taken.","Vendor a newer es5-shim only if you can also drop the accessor usage; the shim cannot polyfill accessors where none exist."],"exampleFix":"// before\nObject.defineProperty(obj, 'size', { get: function () { return this.items.length; } });\n\n// after (engine without accessors)\nobj.getSize = function () { return this.items.length; };\n// or, if the value is stable:\nObject.defineProperty(obj, 'size', { value: obj.items.length, writable: false });","handlingStrategy":"validation","validationCode":"var supportsAccessors = !!(Object.defineProperty && (function(){ var o={}; try { Object.defineProperty(o,'p',{get:function(){return 1;}}); return o.p===1; } catch(e){ return false; } })());\nif (!supportsAccessors) { /* use value descriptors or methods instead */ }","typeGuard":"function engineSupportsAccessors() {\n  try { var o = {}; Object.defineProperty(o, 'x', { get: function(){return 1;} }); return o.x === 1; }\n  catch (e) { return false; }\n}","tryCatchPattern":"try {\n  Object.defineProperty(obj, prop, { get: getter });\n} catch (e) {\n  if (/getters & setters/.test(e.message)) { obj['get_' + prop] = getter; }\n  else throw e;\n}","preventionTips":["Feature-detect accessor support once at startup","Prefer plain values and methods for legacy-browser code","Never assume defineProperty with get/set works on IE8"],"tags":["es5-shim","accessors","legacy-browser","ie8","define-property"],"backgroundTag":null,"analyzedSha":"e815e74d4c2dd74edac831241f1253fcc7d25381","analyzedAt":"2026-08-14T14:22:34.512Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}