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

  1. Replace the accessor descriptor with a plain value descriptor (compute the value eagerly) or a normal method: obj.getValue().
  2. If read-only semantics are needed, use {writable: false, value: v} which the shim can emulate with plain assignment.
  3. Upgrade the target browser/runtime — on any engine with native defineProperty or __defineGetter__ this path is never taken.
  4. 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

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


AI-assisted analysis of dianping/cat@e815e74d4c (2026-08-14). Data as JSON: /api/errors/8092ab71e7ca3a0d. Report an issue: GitHub.