dianping/cat · error · TypeError
getters & setters can not be defined on this javascript engi
Error message
getters & setters can not be defined on this javascript engine
What it means
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.
Source
Thrown at cat-home/src/main/webapp/assets/js/editor/worker-xquery.js:49353
} catch (exception) {
}
}
if (owns(descriptor, "value")) {
if (supportsAccessors && (lookupGetter(object, property) ||
lookupSetter(object, property)))
{
var prototype = object.__proto__;
object.__proto__ = prototypeOfObject;
delete object[property];
object[property] = descriptor.value;
object.__proto__ = prototype;
} else {
object[property] = descriptor.value;
}
} else {
if (!supportsAccessors)
throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
if (owns(descriptor, "get"))
defineGetter(object, property, descriptor.get);
if (owns(descriptor, "set"))
defineSetter(object, property, descriptor.set);
}
return object;
};
}
if (!Object.defineProperties) {
Object.defineProperties = function defineProperties(object, properties) {
for (var property in properties) {
if (owns(properties, property))
Object.defineProperty(object, property, properties[property]);
}
return object;
};
}View on GitHub (pinned to e815e74d4c)
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.
Example fix
// before
Object.defineProperty(obj, 'size', { get: function () { return this.items.length; } });
// after (engine without accessors)
obj.getSize = function () { return this.items.length; };
// or, if the value is stable:
Object.defineProperty(obj, 'size', { value: obj.items.length, writable: false }); Defensive patterns
Strategy: validation
Validate before calling
var supportsAccessors = !!(Object.defineProperty && (function(){ var o={}; try { Object.defineProperty(o,'p',{get:function(){return 1;}}); return o.p===1; } catch(e){ return false; } })());
if (!supportsAccessors) { /* use value descriptors or methods instead */ } Type guard
function engineSupportsAccessors() {
try { var o = {}; Object.defineProperty(o, 'x', { get: function(){return 1;} }); return o.x === 1; }
catch (e) { return false; }
} Try / catch
try {
Object.defineProperty(obj, prop, { get: getter });
} catch (e) {
if (/getters & setters/.test(e.message)) { obj['get_' + prop] = getter; }
else throw e;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- typeof prototype[{typeof prototype}] != 'object'
- Object.defineProperty called on non-object: {object}
- Property description must be an object: {descriptor}
- {fun} is not a function
- reduce of empty array with no initial value
AI-assisted analysis of dianping/cat@e815e74d4c (2026-08-14).
Data as JSON: /api/errors/8092ab71e7ca3a0d.
Report an issue: GitHub.