diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index a5724e8..8175b0d 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -41,23 +41,12 @@
 const char* CJS_PrintParamsObj::g_pClassName = "PrintParamsObj";
 int CJS_PrintParamsObj::g_nObjDefnID = -1;
 
-void CJS_PrintParamsObj::JSConstructor(CFXJS_Engine* pEngine,
-                                       v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_PrintParamsObj(obj);
-  pObj->SetEmbedObject(new PrintParamsObj(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_PrintParamsObj::JSDestructor(CFXJS_Engine* pEngine,
-                                      v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_PrintParamsObj*>(pEngine->GetObjectPrivate(obj));
-}
-
 void CJS_PrintParamsObj::DefineJSObjects(CFXJS_Engine* pEngine,
                                          FXJSOBJTYPE eObjType) {
-  g_nObjDefnID = pEngine->DefineObj(CJS_PrintParamsObj::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
+  g_nObjDefnID =
+      pEngine->DefineObj(CJS_PrintParamsObj::g_pClassName, eObjType,
+                         JSConstructor<CJS_PrintParamsObj, PrintParamsObj>,
+                         JSDestructor<CJS_PrintParamsObj>);
 }
 
 PrintParamsObj::PrintParamsObj(CJS_Object* pJSObject)
@@ -160,40 +149,13 @@
 const char* CJS_Document::g_pClassName = "Document";
 int CJS_Document::g_nObjDefnID = -1;
 
-void CJS_Document::JSConstructor(CFXJS_Engine* pEngine,
-                                 v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Document(obj);
-  pObj->SetEmbedObject(new Document(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Document::JSDestructor(CFXJS_Engine* pEngine,
-                                v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Document*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Document::DefineProps(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(PropertySpecs) - 1; ++i) {
-    pEngine->DefineObjProperty(g_nObjDefnID, PropertySpecs[i].pName,
-                               PropertySpecs[i].pPropGet,
-                               PropertySpecs[i].pPropPut);
-  }
-}
-
-void CJS_Document::DefineMethods(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(MethodSpecs) - 1; ++i) {
-    pEngine->DefineObjMethod(g_nObjDefnID, MethodSpecs[i].pName,
-                             MethodSpecs[i].pMethodCall);
-  }
-}
-
 void CJS_Document::DefineJSObjects(CFXJS_Engine* pEngine,
                                    FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Document::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineProps(pEngine);
-  DefineMethods(pEngine);
+                                    JSConstructor<CJS_Document, Document>,
+                                    JSDestructor<CJS_Document>);
+  DefineProps(pEngine, g_nObjDefnID, PropertySpecs);
+  DefineMethods(pEngine, g_nObjDefnID, MethodSpecs);
 }
 
 void CJS_Document::InitInstance(IJS_Runtime* pIRuntime) {
diff --git a/fpdfsdk/javascript/Document.h b/fpdfsdk/javascript/Document.h
index 6ec916c..308678f 100644
--- a/fpdfsdk/javascript/Document.h
+++ b/fpdfsdk/javascript/Document.h
@@ -41,9 +41,6 @@
   static const char* g_pClassName;
   static int g_nObjDefnID;
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 };
 
@@ -280,12 +277,7 @@
   static JSPropertySpec PropertySpecs[];
   static JSMethodSpec MethodSpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineProps(CFXJS_Engine* pEngine);
-  static void DefineMethods(CFXJS_Engine* pEngine);
 
   JS_STATIC_PROP(ADBE, ADBE, Document);
   JS_STATIC_PROP(author, author, Document);
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index 34c0c7a..288a24d 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -168,38 +168,12 @@
 const char* CJS_Field::g_pClassName = "Field";
 int CJS_Field::g_nObjDefnID = -1;
 
-void CJS_Field::JSConstructor(CFXJS_Engine* pEngine,
-                              v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Field(obj);
-  pObj->SetEmbedObject(new Field(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Field::JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Field*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Field::DefineProps(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(PropertySpecs) - 1; ++i) {
-    pEngine->DefineObjProperty(g_nObjDefnID, PropertySpecs[i].pName,
-                               PropertySpecs[i].pPropGet,
-                               PropertySpecs[i].pPropPut);
-  }
-}
-
-void CJS_Field::DefineMethods(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(MethodSpecs) - 1; ++i) {
-    pEngine->DefineObjMethod(g_nObjDefnID, MethodSpecs[i].pName,
-                             MethodSpecs[i].pMethodCall);
-  }
-}
-
 void CJS_Field::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Field::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineProps(pEngine);
-  DefineMethods(pEngine);
+                                    JSConstructor<CJS_Field, Field>,
+                                    JSDestructor<CJS_Field>);
+  DefineProps(pEngine, g_nObjDefnID, PropertySpecs);
+  DefineMethods(pEngine, g_nObjDefnID, MethodSpecs);
 }
 
 CJS_DelayData::CJS_DelayData(FIELD_PROP prop, int idx, const WideString& name)
diff --git a/fpdfsdk/javascript/Field.h b/fpdfsdk/javascript/Field.h
index cd43b60..5427a69 100644
--- a/fpdfsdk/javascript/Field.h
+++ b/fpdfsdk/javascript/Field.h
@@ -369,12 +369,7 @@
   static JSPropertySpec PropertySpecs[];
   static JSMethodSpec MethodSpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineProps(CFXJS_Engine* pEngine);
-  static void DefineMethods(CFXJS_Engine* pEngine);
 
   JS_STATIC_PROP(alignment, alignment, Field);
   JS_STATIC_PROP(borderStyle, border_style, Field);
diff --git a/fpdfsdk/javascript/Icon.cpp b/fpdfsdk/javascript/Icon.cpp
index d64878b..ab37e13 100644
--- a/fpdfsdk/javascript/Icon.cpp
+++ b/fpdfsdk/javascript/Icon.cpp
@@ -17,29 +17,11 @@
 const char* CJS_Icon::g_pClassName = "Icon";
 int CJS_Icon::g_nObjDefnID = -1;
 
-void CJS_Icon::JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Icon(obj);
-  pObj->SetEmbedObject(new Icon(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Icon::JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Icon*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Icon::DefineProps(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(PropertySpecs) - 1; ++i) {
-    pEngine->DefineObjProperty(g_nObjDefnID, PropertySpecs[i].pName,
-                               PropertySpecs[i].pPropGet,
-                               PropertySpecs[i].pPropPut);
-  }
-}
-
 void CJS_Icon::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
-  g_nObjDefnID = pEngine->DefineObj(CJS_Icon::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineProps(pEngine);
+  g_nObjDefnID =
+      pEngine->DefineObj(CJS_Icon::g_pClassName, eObjType,
+                         JSConstructor<CJS_Icon, Icon>, JSDestructor<CJS_Icon>);
+  DefineProps(pEngine, g_nObjDefnID, PropertySpecs);
 }
 
 Icon::Icon(CJS_Object* pJSObject)
diff --git a/fpdfsdk/javascript/Icon.h b/fpdfsdk/javascript/Icon.h
index 8f2c8fc..2d5ad8c 100644
--- a/fpdfsdk/javascript/Icon.h
+++ b/fpdfsdk/javascript/Icon.h
@@ -35,11 +35,7 @@
   static int g_nObjDefnID;
   static JSPropertySpec PropertySpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineProps(CFXJS_Engine* pEngine);
 
   JS_STATIC_PROP(name, name, Icon);
 };
diff --git a/fpdfsdk/javascript/JS_Define.h b/fpdfsdk/javascript/JS_Define.h
index 7d089aa..e0535fa 100644
--- a/fpdfsdk/javascript/JS_Define.h
+++ b/fpdfsdk/javascript/JS_Define.h
@@ -21,25 +21,18 @@
 // Rich JS classes provide constants, methods, properties, and the ability
 // to construct native object state.
 
-struct JSConstSpec {
-  enum Type { Number = 0, String = 1 };
+template <class T, class A>
+static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
+  CJS_Object* pObj = new T(obj);
+  pObj->SetEmbedObject(new A(pObj));
+  pEngine->SetObjectPrivate(obj, pObj);
+  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
+}
 
-  const char* pName;
-  Type eType;
-  double number;
-  const char* pStr;
-};
-
-struct JSPropertySpec {
-  const char* pName;
-  v8::AccessorGetterCallback pPropGet;
-  v8::AccessorSetterCallback pPropPut;
-};
-
-struct JSMethodSpec {
-  const char* pName;
-  v8::FunctionCallback pMethodCall;
-};
+template <class T>
+static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
+  delete static_cast<T*>(pEngine->GetObjectPrivate(obj));
+}
 
 template <class C, CJS_Return (C::*M)(CJS_Runtime*)>
 void JSPropGetter(const char* prop_name_string,
diff --git a/fpdfsdk/javascript/JS_Object.cpp b/fpdfsdk/javascript/JS_Object.cpp
index 01a4641..b6e63b5 100644
--- a/fpdfsdk/javascript/JS_Object.cpp
+++ b/fpdfsdk/javascript/JS_Object.cpp
@@ -11,7 +11,37 @@
 
 CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : m_pJSObject(pJSObject) {}
 
-CJS_EmbedObj::~CJS_EmbedObj() {
+CJS_EmbedObj::~CJS_EmbedObj() {}
+
+// static
+void CJS_Object::DefineConsts(CFXJS_Engine* pEngine,
+                              int objId,
+                              const JSConstSpec consts[]) {
+  for (size_t i = 0; consts[i].pName != 0; ++i) {
+    pEngine->DefineObjConst(
+        objId, consts[i].pName,
+        consts[i].eType == JSConstSpec::Number
+            ? pEngine->NewNumber(consts[i].number).As<v8::Value>()
+            : pEngine->NewString(consts[i].pStr).As<v8::Value>());
+  }
+}
+
+// static
+void CJS_Object::DefineProps(CFXJS_Engine* pEngine,
+                             int objId,
+                             const JSPropertySpec props[]) {
+  for (size_t i = 0; props[i].pName != 0; ++i) {
+    pEngine->DefineObjProperty(objId, props[i].pName, props[i].pPropGet,
+                               props[i].pPropPut);
+  }
+}
+
+// static
+void CJS_Object::DefineMethods(CFXJS_Engine* pEngine,
+                               int objId,
+                               const JSMethodSpec methods[]) {
+  for (size_t i = 0; methods[i].pName != 0; ++i)
+    pEngine->DefineObjMethod(objId, methods[i].pName, methods[i].pMethodCall);
 }
 
 CJS_Object::CJS_Object(v8::Local<v8::Object> pObject) {
diff --git a/fpdfsdk/javascript/JS_Object.h b/fpdfsdk/javascript/JS_Object.h
index e0a96a9..20d5203 100644
--- a/fpdfsdk/javascript/JS_Object.h
+++ b/fpdfsdk/javascript/JS_Object.h
@@ -18,6 +18,26 @@
 class CJS_Object;
 class CPDFSDK_FormFillEnvironment;
 
+struct JSConstSpec {
+  enum Type { Number = 0, String = 1 };
+
+  const char* pName;
+  Type eType;
+  double number;
+  const char* pStr;
+};
+
+struct JSPropertySpec {
+  const char* pName;
+  v8::AccessorGetterCallback pPropGet;
+  v8::AccessorSetterCallback pPropPut;
+};
+
+struct JSMethodSpec {
+  const char* pName;
+  v8::FunctionCallback pMethodCall;
+};
+
 class CJS_EmbedObj {
  public:
   explicit CJS_EmbedObj(CJS_Object* pJSObject);
@@ -31,6 +51,16 @@
 
 class CJS_Object {
  public:
+  static void DefineConsts(CFXJS_Engine* pEngine,
+                           int objId,
+                           const JSConstSpec consts[]);
+  static void DefineProps(CFXJS_Engine* pEngine,
+                          int objId,
+                          const JSPropertySpec props[]);
+  static void DefineMethods(CFXJS_Engine* pEngine,
+                            int objId,
+                            const JSMethodSpec methods[]);
+
   explicit CJS_Object(v8::Local<v8::Object> pObject);
   virtual ~CJS_Object();
 
diff --git a/fpdfsdk/javascript/app.cpp b/fpdfsdk/javascript/app.cpp
index 84bca4a..0b331a8 100644
--- a/fpdfsdk/javascript/app.cpp
+++ b/fpdfsdk/javascript/app.cpp
@@ -145,23 +145,11 @@
 const char* CJS_TimerObj::g_pClassName = "TimerObj";
 int CJS_TimerObj::g_nObjDefnID = -1;
 
-void CJS_TimerObj::JSConstructor(CFXJS_Engine* pEngine,
-                                 v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_TimerObj(obj);
-  pObj->SetEmbedObject(new TimerObj(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_TimerObj::JSDestructor(CFXJS_Engine* pEngine,
-                                v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_TimerObj*>(pEngine->GetObjectPrivate(obj));
-}
-
 void CJS_TimerObj::DefineJSObjects(CFXJS_Engine* pEngine,
                                    FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_TimerObj::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
+                                    JSConstructor<CJS_TimerObj, TimerObj>,
+                                    JSDestructor<CJS_TimerObj>);
 }
 
 TimerObj::TimerObj(CJS_Object* pJSObject)
@@ -226,37 +214,12 @@
 const char* CJS_App::g_pClassName = "app";
 int CJS_App::g_nObjDefnID = -1;
 
-void CJS_App::JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_App(obj);
-  pObj->SetEmbedObject(new app(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_App::JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_App*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_App::DefineProps(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(PropertySpecs) - 1; ++i) {
-    pEngine->DefineObjProperty(g_nObjDefnID, PropertySpecs[i].pName,
-                               PropertySpecs[i].pPropGet,
-                               PropertySpecs[i].pPropPut);
-  }
-}
-
-void CJS_App::DefineMethods(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(MethodSpecs) - 1; ++i) {
-    pEngine->DefineObjMethod(g_nObjDefnID, MethodSpecs[i].pName,
-                             MethodSpecs[i].pMethodCall);
-  }
-}
-
 void CJS_App::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
-  g_nObjDefnID = pEngine->DefineObj(CJS_App::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineProps(pEngine);
-  DefineMethods(pEngine);
+  g_nObjDefnID =
+      pEngine->DefineObj(CJS_App::g_pClassName, eObjType,
+                         JSConstructor<CJS_App, app>, JSDestructor<CJS_App>);
+  DefineProps(pEngine, g_nObjDefnID, PropertySpecs);
+  DefineMethods(pEngine, g_nObjDefnID, MethodSpecs);
 }
 
 app::app(CJS_Object* pJSObject)
diff --git a/fpdfsdk/javascript/app.h b/fpdfsdk/javascript/app.h
index 36d2a84..454bb42 100644
--- a/fpdfsdk/javascript/app.h
+++ b/fpdfsdk/javascript/app.h
@@ -36,9 +36,6 @@
   static const char* g_pClassName;
   static int g_nObjDefnID;
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 };
 
@@ -154,12 +151,7 @@
   static JSPropertySpec PropertySpecs[];
   static JSMethodSpec MethodSpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineProps(CFXJS_Engine* pEngine);
-  static void DefineMethods(CFXJS_Engine* pEngine);
 
   JS_STATIC_PROP(activeDocs, active_docs, app);
   JS_STATIC_PROP(calculate, calculate, app);
diff --git a/fpdfsdk/javascript/cjs_annot.cpp b/fpdfsdk/javascript/cjs_annot.cpp
index 8847642..9f528a3 100644
--- a/fpdfsdk/javascript/cjs_annot.cpp
+++ b/fpdfsdk/javascript/cjs_annot.cpp
@@ -28,30 +28,11 @@
 const char* CJS_Annot::g_pClassName = "Annot";
 int CJS_Annot::g_nObjDefnID = -1;
 
-void CJS_Annot::JSConstructor(CFXJS_Engine* pEngine,
-                              v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Annot(obj);
-  pObj->SetEmbedObject(new Annot(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Annot::JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Annot*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Annot::DefineProps(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(PropertySpecs) - 1; ++i) {
-    pEngine->DefineObjProperty(g_nObjDefnID, PropertySpecs[i].pName,
-                               PropertySpecs[i].pPropGet,
-                               PropertySpecs[i].pPropPut);
-  }
-}
-
 void CJS_Annot::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Annot::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineProps(pEngine);
+                                    JSConstructor<CJS_Annot, Annot>,
+                                    JSDestructor<CJS_Annot>);
+  DefineProps(pEngine, g_nObjDefnID, PropertySpecs);
 }
 
 Annot::Annot(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {}
diff --git a/fpdfsdk/javascript/cjs_annot.h b/fpdfsdk/javascript/cjs_annot.h
index 086392c..a16e510 100644
--- a/fpdfsdk/javascript/cjs_annot.h
+++ b/fpdfsdk/javascript/cjs_annot.h
@@ -39,11 +39,7 @@
   static int g_nObjDefnID;
   static JSPropertySpec PropertySpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineProps(CFXJS_Engine* pEngine);
 
   JS_STATIC_PROP(hidden, hidden, Annot);
   JS_STATIC_PROP(name, name, Annot);
diff --git a/fpdfsdk/javascript/cjs_border.cpp b/fpdfsdk/javascript/cjs_border.cpp
index 50e69b2..6bb2e09 100644
--- a/fpdfsdk/javascript/cjs_border.cpp
+++ b/fpdfsdk/javascript/cjs_border.cpp
@@ -17,18 +17,8 @@
 const char* CJS_Border::g_pClassName = "border";
 int CJS_Border::g_nObjDefnID = -1;
 
-void CJS_Border::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
 void CJS_Border::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID =
       pEngine->DefineObj(CJS_Border::g_pClassName, eObjType, nullptr, nullptr);
-  DefineConsts(pEngine);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
 }
diff --git a/fpdfsdk/javascript/cjs_border.h b/fpdfsdk/javascript/cjs_border.h
index c3ce247..26a710a 100644
--- a/fpdfsdk/javascript/cjs_border.h
+++ b/fpdfsdk/javascript/cjs_border.h
@@ -16,10 +16,9 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
-  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-
   static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
+
+  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_CJS_BORDER_H_
diff --git a/fpdfsdk/javascript/cjs_display.cpp b/fpdfsdk/javascript/cjs_display.cpp
index df05ed2..5d604b5 100644
--- a/fpdfsdk/javascript/cjs_display.cpp
+++ b/fpdfsdk/javascript/cjs_display.cpp
@@ -15,18 +15,8 @@
 const char* CJS_Display::g_pClassName = "display";
 int CJS_Display::g_nObjDefnID = -1;
 
-void CJS_Display::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
 void CJS_Display::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID =
       pEngine->DefineObj(CJS_Display::g_pClassName, eObjType, nullptr, nullptr);
-  DefineConsts(pEngine);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
 }
diff --git a/fpdfsdk/javascript/cjs_display.h b/fpdfsdk/javascript/cjs_display.h
index f92eb86..61e741d 100644
--- a/fpdfsdk/javascript/cjs_display.h
+++ b/fpdfsdk/javascript/cjs_display.h
@@ -16,10 +16,9 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
-  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-
   static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
+
+  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_CJS_DISPLAY_H_
diff --git a/fpdfsdk/javascript/cjs_font.cpp b/fpdfsdk/javascript/cjs_font.cpp
index 799702c..0a9f02f 100644
--- a/fpdfsdk/javascript/cjs_font.cpp
+++ b/fpdfsdk/javascript/cjs_font.cpp
@@ -26,18 +26,8 @@
 const char* CJS_Font::g_pClassName = "font";
 int CJS_Font::g_nObjDefnID = -1;
 
-void CJS_Font::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
 void CJS_Font::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID =
       pEngine->DefineObj(CJS_Font::g_pClassName, eObjType, nullptr, nullptr);
-  DefineConsts(pEngine);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
 }
diff --git a/fpdfsdk/javascript/cjs_font.h b/fpdfsdk/javascript/cjs_font.h
index d45a578..7881cdf 100644
--- a/fpdfsdk/javascript/cjs_font.h
+++ b/fpdfsdk/javascript/cjs_font.h
@@ -16,10 +16,9 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
-  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-
   static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
+
+  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_CJS_FONT_H_
diff --git a/fpdfsdk/javascript/cjs_global.cpp b/fpdfsdk/javascript/cjs_global.cpp
index d81fe04..1ec9bbf 100644
--- a/fpdfsdk/javascript/cjs_global.cpp
+++ b/fpdfsdk/javascript/cjs_global.cpp
@@ -199,44 +199,6 @@
   pGlobal->Initial(pRuntime->GetFormFillEnv());
 }
 
-void CJS_Global::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
-void CJS_Global::JSConstructor(CFXJS_Engine* pEngine,
-                               v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Global(obj);
-  pObj->SetEmbedObject(new JSGlobalAlternate(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Global::JSDestructor(CFXJS_Engine* pEngine,
-                              v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Global*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Global::DefineProps(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(PropertySpecs) - 1; ++i) {
-    pEngine->DefineObjProperty(g_nObjDefnID, PropertySpecs[i].pName,
-                               PropertySpecs[i].pPropGet,
-                               PropertySpecs[i].pPropPut);
-  }
-}
-
-void CJS_Global::DefineMethods(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(MethodSpecs) - 1; ++i) {
-    pEngine->DefineObjMethod(g_nObjDefnID, MethodSpecs[i].pName,
-                             MethodSpecs[i].pMethodCall);
-  }
-}
-
 void CJS_Global::queryprop_static(
     v8::Local<v8::String> property,
     const v8::PropertyCallbackInfo<v8::Integer>& info) {
@@ -269,11 +231,12 @@
 }
 
 void CJS_Global::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
-  g_nObjDefnID = pEngine->DefineObj(CJS_Global::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineConsts(pEngine);
-  DefineProps(pEngine);
-  DefineMethods(pEngine);
+  g_nObjDefnID = pEngine->DefineObj(
+      CJS_Global::g_pClassName, eObjType,
+      JSConstructor<CJS_Global, JSGlobalAlternate>, JSDestructor<CJS_Global>);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
+  DefineProps(pEngine, g_nObjDefnID, PropertySpecs);
+  DefineMethods(pEngine, g_nObjDefnID, MethodSpecs);
   DefineAllProperties(pEngine);
 }
 
diff --git a/fpdfsdk/javascript/cjs_global.h b/fpdfsdk/javascript/cjs_global.h
index 96788f7..8174418 100644
--- a/fpdfsdk/javascript/cjs_global.h
+++ b/fpdfsdk/javascript/cjs_global.h
@@ -19,18 +19,13 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
-  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-
   static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
-
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void DefineProps(CFXJS_Engine* pEngine);
-  static void DefineMethods(CFXJS_Engine* pEngine);
   static JSPropertySpec PropertySpecs[];
   static JSMethodSpec MethodSpecs[];
 
+  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
+  static void DefineAllProperties(CFXJS_Engine* pEngine);
+
   static void queryprop_static(
       v8::Local<v8::String> property,
       const v8::PropertyCallbackInfo<v8::Integer>& info);
@@ -41,7 +36,6 @@
                              const v8::PropertyCallbackInfo<v8::Value>& info);
   static void delprop_static(v8::Local<v8::String> property,
                              const v8::PropertyCallbackInfo<v8::Boolean>& info);
-  static void DefineAllProperties(CFXJS_Engine* pEngine);
 
   static void setPersistent_static(
       const v8::FunctionCallbackInfo<v8::Value>& info);
diff --git a/fpdfsdk/javascript/cjs_highlight.cpp b/fpdfsdk/javascript/cjs_highlight.cpp
index 6cd40dc..5a5f7bf 100644
--- a/fpdfsdk/javascript/cjs_highlight.cpp
+++ b/fpdfsdk/javascript/cjs_highlight.cpp
@@ -16,19 +16,9 @@
 const char* CJS_Highlight::g_pClassName = "highlight";
 int CJS_Highlight::g_nObjDefnID = -1;
 
-void CJS_Highlight::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
 void CJS_Highlight::DefineJSObjects(CFXJS_Engine* pEngine,
                                     FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Highlight::g_pClassName, eObjType,
                                     nullptr, nullptr);
-  DefineConsts(pEngine);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
 }
diff --git a/fpdfsdk/javascript/cjs_highlight.h b/fpdfsdk/javascript/cjs_highlight.h
index 0ac645d..dd16e0c 100644
--- a/fpdfsdk/javascript/cjs_highlight.h
+++ b/fpdfsdk/javascript/cjs_highlight.h
@@ -16,10 +16,9 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
-  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-
   static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
+
+  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_CJS_HIGHLIGHT_H_
diff --git a/fpdfsdk/javascript/cjs_position.cpp b/fpdfsdk/javascript/cjs_position.cpp
index 5c33546..46b908b 100644
--- a/fpdfsdk/javascript/cjs_position.cpp
+++ b/fpdfsdk/javascript/cjs_position.cpp
@@ -19,19 +19,9 @@
 const char* CJS_Position::g_pClassName = "position";
 int CJS_Position::g_nObjDefnID = -1;
 
-void CJS_Position::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
 void CJS_Position::DefineJSObjects(CFXJS_Engine* pEngine,
                                    FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Position::g_pClassName, eObjType,
                                     nullptr, nullptr);
-  DefineConsts(pEngine);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
 }
diff --git a/fpdfsdk/javascript/cjs_position.h b/fpdfsdk/javascript/cjs_position.h
index 54d12c5..f180af4 100644
--- a/fpdfsdk/javascript/cjs_position.h
+++ b/fpdfsdk/javascript/cjs_position.h
@@ -16,10 +16,9 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
-  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-
   static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
+
+  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_CJS_POSITION_H_
diff --git a/fpdfsdk/javascript/cjs_scalehow.cpp b/fpdfsdk/javascript/cjs_scalehow.cpp
index 25160ba..d593d83 100644
--- a/fpdfsdk/javascript/cjs_scalehow.cpp
+++ b/fpdfsdk/javascript/cjs_scalehow.cpp
@@ -14,19 +14,9 @@
 const char* CJS_ScaleHow::g_pClassName = "scaleHow";
 int CJS_ScaleHow::g_nObjDefnID = -1;
 
-void CJS_ScaleHow::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
 void CJS_ScaleHow::DefineJSObjects(CFXJS_Engine* pEngine,
                                    FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_ScaleHow::g_pClassName, eObjType,
                                     nullptr, nullptr);
-  DefineConsts(pEngine);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
 }
diff --git a/fpdfsdk/javascript/cjs_scalehow.h b/fpdfsdk/javascript/cjs_scalehow.h
index c742398..2d3906e 100644
--- a/fpdfsdk/javascript/cjs_scalehow.h
+++ b/fpdfsdk/javascript/cjs_scalehow.h
@@ -16,10 +16,10 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
+  static JSConstSpec ConstSpecs[];
+
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 
-  static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_CJS_SCALEHOW_H_
diff --git a/fpdfsdk/javascript/cjs_scalewhen.cpp b/fpdfsdk/javascript/cjs_scalewhen.cpp
index 22c6784..129a150 100644
--- a/fpdfsdk/javascript/cjs_scalewhen.cpp
+++ b/fpdfsdk/javascript/cjs_scalewhen.cpp
@@ -16,19 +16,9 @@
 const char* CJS_ScaleWhen::g_pClassName = "scaleWhen";
 int CJS_ScaleWhen::g_nObjDefnID = -1;
 
-void CJS_ScaleWhen::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
 void CJS_ScaleWhen::DefineJSObjects(CFXJS_Engine* pEngine,
                                     FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_ScaleWhen::g_pClassName, eObjType,
                                     nullptr, nullptr);
-  DefineConsts(pEngine);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
 }
diff --git a/fpdfsdk/javascript/cjs_scalewhen.h b/fpdfsdk/javascript/cjs_scalewhen.h
index d7727e9..72e8de1 100644
--- a/fpdfsdk/javascript/cjs_scalewhen.h
+++ b/fpdfsdk/javascript/cjs_scalewhen.h
@@ -16,10 +16,10 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
+  static JSConstSpec ConstSpecs[];
+
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 
-  static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_CJS_SCALEWHEN_H_
diff --git a/fpdfsdk/javascript/cjs_style.cpp b/fpdfsdk/javascript/cjs_style.cpp
index 872851f..5706413 100644
--- a/fpdfsdk/javascript/cjs_style.cpp
+++ b/fpdfsdk/javascript/cjs_style.cpp
@@ -18,18 +18,8 @@
 const char* CJS_Style::g_pClassName = "style";
 int CJS_Style::g_nObjDefnID = -1;
 
-void CJS_Style::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
 void CJS_Style::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID =
       pEngine->DefineObj(CJS_Style::g_pClassName, eObjType, nullptr, nullptr);
-  DefineConsts(pEngine);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
 }
diff --git a/fpdfsdk/javascript/cjs_style.h b/fpdfsdk/javascript/cjs_style.h
index 0c98f50..2609f3e 100644
--- a/fpdfsdk/javascript/cjs_style.h
+++ b/fpdfsdk/javascript/cjs_style.h
@@ -16,10 +16,9 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
-  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-
   static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
+
+  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_CJS_STYLE_H_
diff --git a/fpdfsdk/javascript/cjs_zoomtype.cpp b/fpdfsdk/javascript/cjs_zoomtype.cpp
index fb5e2ab..8870776 100644
--- a/fpdfsdk/javascript/cjs_zoomtype.cpp
+++ b/fpdfsdk/javascript/cjs_zoomtype.cpp
@@ -19,19 +19,9 @@
 const char* CJS_Zoomtype::g_pClassName = "zoomtype";
 int CJS_Zoomtype::g_nObjDefnID = -1;
 
-void CJS_Zoomtype::DefineConsts(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) {
-    pEngine->DefineObjConst(
-        g_nObjDefnID, ConstSpecs[i].pName,
-        ConstSpecs[i].eType == JSConstSpec::Number
-            ? pEngine->NewNumber(ConstSpecs[i].number).As<v8::Value>()
-            : pEngine->NewString(ConstSpecs[i].pStr).As<v8::Value>());
-  }
-}
-
 void CJS_Zoomtype::DefineJSObjects(CFXJS_Engine* pEngine,
                                    FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Zoomtype::g_pClassName, eObjType,
                                     nullptr, nullptr);
-  DefineConsts(pEngine);
+  DefineConsts(pEngine, g_nObjDefnID, ConstSpecs);
 }
diff --git a/fpdfsdk/javascript/cjs_zoomtype.h b/fpdfsdk/javascript/cjs_zoomtype.h
index b204d58..e7dd7da 100644
--- a/fpdfsdk/javascript/cjs_zoomtype.h
+++ b/fpdfsdk/javascript/cjs_zoomtype.h
@@ -16,10 +16,9 @@
 
   static const char* g_pClassName;
   static int g_nObjDefnID;
-  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-
   static JSConstSpec ConstSpecs[];
-  static void DefineConsts(CFXJS_Engine* pEngine);
+
+  static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_CJS_ZOOMTYPE_H_
diff --git a/fpdfsdk/javascript/color.cpp b/fpdfsdk/javascript/color.cpp
index 25008b4..0e05ddf 100644
--- a/fpdfsdk/javascript/color.cpp
+++ b/fpdfsdk/javascript/color.cpp
@@ -37,38 +37,12 @@
 const char* CJS_Color::g_pClassName = "color";
 int CJS_Color::g_nObjDefnID = -1;
 
-void CJS_Color::JSConstructor(CFXJS_Engine* pEngine,
-                              v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Color(obj);
-  pObj->SetEmbedObject(new color(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Color::JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Color*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Color::DefineProps(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(PropertySpecs) - 1; ++i) {
-    pEngine->DefineObjProperty(g_nObjDefnID, PropertySpecs[i].pName,
-                               PropertySpecs[i].pPropGet,
-                               PropertySpecs[i].pPropPut);
-  }
-}
-
-void CJS_Color::DefineMethods(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(MethodSpecs) - 1; ++i) {
-    pEngine->DefineObjMethod(g_nObjDefnID, MethodSpecs[i].pName,
-                             MethodSpecs[i].pMethodCall);
-  }
-}
-
 void CJS_Color::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Color::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineProps(pEngine);
-  DefineMethods(pEngine);
+                                    JSConstructor<CJS_Color, color>,
+                                    JSDestructor<CJS_Color>);
+  DefineProps(pEngine, g_nObjDefnID, PropertySpecs);
+  DefineMethods(pEngine, g_nObjDefnID, MethodSpecs);
 }
 
 // static
diff --git a/fpdfsdk/javascript/color.h b/fpdfsdk/javascript/color.h
index dd5ca41..5705787 100644
--- a/fpdfsdk/javascript/color.h
+++ b/fpdfsdk/javascript/color.h
@@ -93,12 +93,7 @@
   static JSPropertySpec PropertySpecs[];
   static JSMethodSpec MethodSpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineProps(CFXJS_Engine* pEngine);
-  static void DefineMethods(CFXJS_Engine* pEngine);
 
   JS_STATIC_PROP(black, black, color);
   JS_STATIC_PROP(blue, blue, color);
diff --git a/fpdfsdk/javascript/console.cpp b/fpdfsdk/javascript/console.cpp
index eb566b0..dbe8e32 100644
--- a/fpdfsdk/javascript/console.cpp
+++ b/fpdfsdk/javascript/console.cpp
@@ -23,30 +23,11 @@
 const char* CJS_Console::g_pClassName = "console";
 int CJS_Console::g_nObjDefnID = -1;
 
-void CJS_Console::JSConstructor(CFXJS_Engine* pEngine,
-                                v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Console(obj);
-  pObj->SetEmbedObject(new console(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Console::JSDestructor(CFXJS_Engine* pEngine,
-                               v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Console*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Console::DefineMethods(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(MethodSpecs) - 1; ++i) {
-    pEngine->DefineObjMethod(g_nObjDefnID, MethodSpecs[i].pName,
-                             MethodSpecs[i].pMethodCall);
-  }
-}
-
 void CJS_Console::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Console::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineMethods(pEngine);
+                                    JSConstructor<CJS_Console, console>,
+                                    JSDestructor<CJS_Console>);
+  DefineMethods(pEngine, g_nObjDefnID, MethodSpecs);
 }
 
 console::console(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {}
diff --git a/fpdfsdk/javascript/console.h b/fpdfsdk/javascript/console.h
index 1d85765..ca0c144 100644
--- a/fpdfsdk/javascript/console.h
+++ b/fpdfsdk/javascript/console.h
@@ -36,11 +36,7 @@
   static int g_nObjDefnID;
   static JSMethodSpec MethodSpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineMethods(CFXJS_Engine* pEngine);
 
   JS_STATIC_METHOD(clear, console);
   JS_STATIC_METHOD(hide, console);
diff --git a/fpdfsdk/javascript/event.cpp b/fpdfsdk/javascript/event.cpp
index f20ac40..61aa546 100644
--- a/fpdfsdk/javascript/event.cpp
+++ b/fpdfsdk/javascript/event.cpp
@@ -39,30 +39,11 @@
 const char* CJS_Event::g_pClassName = "event";
 int CJS_Event::g_nObjDefnID = -1;
 
-void CJS_Event::JSConstructor(CFXJS_Engine* pEngine,
-                              v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Event(obj);
-  pObj->SetEmbedObject(new event(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Event::JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Event*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Event::DefineProps(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(PropertySpecs) - 1; ++i) {
-    pEngine->DefineObjProperty(g_nObjDefnID, PropertySpecs[i].pName,
-                               PropertySpecs[i].pPropGet,
-                               PropertySpecs[i].pPropPut);
-  }
-}
-
 void CJS_Event::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Event::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineProps(pEngine);
+                                    JSConstructor<CJS_Event, event>,
+                                    JSDestructor<CJS_Event>);
+  DefineProps(pEngine, g_nObjDefnID, PropertySpecs);
 }
 
 event::event(CJS_Object* pJsObject) : CJS_EmbedObj(pJsObject) {}
diff --git a/fpdfsdk/javascript/event.h b/fpdfsdk/javascript/event.h
index 4d03f45..6974563 100644
--- a/fpdfsdk/javascript/event.h
+++ b/fpdfsdk/javascript/event.h
@@ -84,11 +84,7 @@
   static int g_nObjDefnID;
   static JSPropertySpec PropertySpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineProps(CFXJS_Engine* pEngine);
 
   JS_STATIC_PROP(change, change, event);
   JS_STATIC_PROP(changeEx, change_ex, event);
diff --git a/fpdfsdk/javascript/report.cpp b/fpdfsdk/javascript/report.cpp
index 7652ce4..eec6118 100644
--- a/fpdfsdk/javascript/report.cpp
+++ b/fpdfsdk/javascript/report.cpp
@@ -19,30 +19,11 @@
 const char* CJS_Report::g_pClassName = "Report";
 int CJS_Report::g_nObjDefnID = -1;
 
-void CJS_Report::JSConstructor(CFXJS_Engine* pEngine,
-                               v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Report(obj);
-  pObj->SetEmbedObject(new Report(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Report::JSDestructor(CFXJS_Engine* pEngine,
-                              v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Report*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Report::DefineMethods(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(MethodSpecs) - 1; ++i) {
-    pEngine->DefineObjMethod(g_nObjDefnID, MethodSpecs[i].pName,
-                             MethodSpecs[i].pMethodCall);
-  }
-}
-
 void CJS_Report::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
   g_nObjDefnID = pEngine->DefineObj(CJS_Report::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineMethods(pEngine);
+                                    JSConstructor<CJS_Report, Report>,
+                                    JSDestructor<CJS_Report>);
+  DefineMethods(pEngine, g_nObjDefnID, MethodSpecs);
 }
 
 Report::Report(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {}
diff --git a/fpdfsdk/javascript/report.h b/fpdfsdk/javascript/report.h
index d6fe4e7..13a6718 100644
--- a/fpdfsdk/javascript/report.h
+++ b/fpdfsdk/javascript/report.h
@@ -32,11 +32,7 @@
   static int g_nObjDefnID;
   static JSMethodSpec MethodSpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineMethods(CFXJS_Engine* pEngine);
 
   JS_STATIC_METHOD(save, Report)
   JS_STATIC_METHOD(writeText, Report);
diff --git a/fpdfsdk/javascript/util.cpp b/fpdfsdk/javascript/util.cpp
index 08846c1..75b0db3 100644
--- a/fpdfsdk/javascript/util.cpp
+++ b/fpdfsdk/javascript/util.cpp
@@ -36,28 +36,11 @@
 const char* CJS_Util::g_pClassName = "util";
 int CJS_Util::g_nObjDefnID = -1;
 
-void CJS_Util::JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  CJS_Object* pObj = new CJS_Util(obj);
-  pObj->SetEmbedObject(new util(pObj));
-  pEngine->SetObjectPrivate(obj, pObj);
-  pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine));
-}
-
-void CJS_Util::JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj) {
-  delete static_cast<CJS_Util*>(pEngine->GetObjectPrivate(obj));
-}
-
-void CJS_Util::DefineMethods(CFXJS_Engine* pEngine) {
-  for (size_t i = 0; i < FX_ArraySize(MethodSpecs) - 1; ++i) {
-    pEngine->DefineObjMethod(g_nObjDefnID, MethodSpecs[i].pName,
-                             MethodSpecs[i].pMethodCall);
-  }
-}
-
 void CJS_Util::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
-  g_nObjDefnID = pEngine->DefineObj(CJS_Util::g_pClassName, eObjType,
-                                    JSConstructor, JSDestructor);
-  DefineMethods(pEngine);
+  g_nObjDefnID =
+      pEngine->DefineObj(CJS_Util::g_pClassName, eObjType,
+                         JSConstructor<CJS_Util, util>, JSDestructor<CJS_Util>);
+  DefineMethods(pEngine, g_nObjDefnID, MethodSpecs);
 }
 
 namespace {
diff --git a/fpdfsdk/javascript/util.h b/fpdfsdk/javascript/util.h
index 8903eb9..c3ede9a 100644
--- a/fpdfsdk/javascript/util.h
+++ b/fpdfsdk/javascript/util.h
@@ -51,11 +51,7 @@
   static int g_nObjDefnID;
   static JSMethodSpec MethodSpecs[];
 
-  static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-  static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj);
-
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
-  static void DefineMethods(CFXJS_Engine* pEngine);
 
   JS_STATIC_METHOD(printd, util);
   JS_STATIC_METHOD(printf, util);
