This is an archived page. It's not actively maintained.


Obsolete since JavaScript 1.8.5
This feature is obsolete. Although it may still work in some browsers, its use is discouraged since it could be removed at any time. Try to avoid using it.

JSExtendedClass is an extended version of JSClass with additional hooks.

A C/C++ program can use a JSExtendedClass with the JS_InitClass and JS_NewObject APIs to create objects that have custom methods and properties implemented in C/C++.


struct JSExtendedClass {
   JSClass             base;
   JSEqualityOp        equality;
   JSObjectOp          outerObject;
   JSObjectOp          innerObject;
   JSIteratorOp        iteratorObject;// Added in SpiderMonkey 1.8
   JSObjectOp          wrappedObject; // Added in SpiderMonkey 1.8

   ...and additional reserved fields.
Name Type Description
base JSClass The basic class information and callbacks for this class. This contains some required fields.
equality JSEqualityOp Optional. Overrides the JavaScript == and != operators.
outerObject JSObjectOp Optional. Return the current outer object. This is used to implement split objects.
innerObject JSObjectOp Optional. Return the current inner object. This is used to implement split objects.
iteratorObject JSIteratorOp Added in SpiderMonkey 1.8 Optional. Creates and returns a new iterator.
wrappedObject JSObjectOp Added in SpiderMonkey 1.8 Optional. If non-null, an object of this class may serve as a wrapper for another object. Wrappers sometimes transparently behave like the object they wrap. For example, an object and its wrappers are all equal under ===.


To implement a custom class that uses any of the JSExtendedClass callbacks:

  • Create a JSExtendedClass and populate both the base fields and the extended fields.
  • Ensure that the additional reserved fields at the end of the JSExtendedClass are NULL. JSClass and JSExtendedClass structs should usually be global, and in this case the compiler automatically initializes these fields to NULL. (This is a feature of the C and C++ languages.) Otherwise, use memset.
  • Set the JSCLASS_IS_EXTENDED flag in myExtendedClass.base.flags.
  • Pass &myExtendedClass.base to functions like JS_InitClass or JS_NewObject that require a JSClass *.

See Also