The Tcl_ObjType structure holds the type descriptor for a Tcl_Obj of a particular type. It contains five fields that characterize the common operations that Tcl can perform on all values; all other operations require that values be of one (or one of a few) specific type(s). Each instance of this structure is assumed to be a C constant: Tcl does not ever try to deallocate them.

Its definition (from tcl.h) is:

 * The following structure represents a type of object, which is a particular
 * internal representation for an object plus a set of functions that provide
 * standard operations on objects of that type.

typedef struct Tcl_ObjType {
    const char *name;           /* Name of the type, e.g. "int". */
    Tcl_FreeInternalRepProc *freeIntRepProc;
                                /* Called to free any storage for the type's
                                 * internal rep. NULL if the internal rep does
                                 * not need freeing. */
    Tcl_DupInternalRepProc *dupIntRepProc;
                                /* Called to create a new object as a copy of
                                 * an existing object. */
    Tcl_UpdateStringProc *updateStringProc;
                                /* Called to update the string rep from the
                                 * type's internal representation. */
    Tcl_SetFromAnyProc *setFromAnyProc;
                                /* Called to convert the object's internal rep
                                 * to this type. Frees the internal rep of the
                                 * old type. Returns TCL_ERROR on failure. */
} Tcl_ObjType;

This definition has been highly conserved: it is identical from 8.0 to (at least) 8.6. This is because it is used in external code.

Notes on the fields:

Used for registration of the type with Tcl_RegisterObjType, lookup with Tcl_GetObjType, and reported by tcl::unsupported::representation.
Used to dispose of objects of this type. If NULL, the type's information is assumed to be wholly contained within the object's internalRep field and so is dropped. (For example, this is true for most numeric types.)
Used to duplicate the internal representation of an object. If NULL, the information is duplicated by just doing a memcpy() of the internal representation.
Used to generate the UTF-8 string representation of an object if it doesn't exist. Can only be NULL if the type never disposes with the bytes field's contents and always requires that field to be non-NULL on creation of the type. This is a fairly common pattern for types that are caches of parsed information and lookups.
Used to convert an object to the type (i.e., to populate the internalRep and typePtr fields) but only when called via Tcl_ConvertToType. If NULL, Tcl will panic if you try to create an instance of the type that way. Note that many types (especially cache types) require more contextual information in order to be created, and so leave this NULL as they are build exclusively in contexts where that information is present.

It's not an "object system" by the way. It's a caching scheme for various representations of values.
dgp, Tcl Chatroom, 2014-05-13
even talking/thinking about "object" will subtly lead you into risking eias violations :P
MS, Tcl chatroom, 2014-05-14

Lists of pre-defined types

Tcl_Obj types list