diff --git a/fpdfsdk/javascript/console.cpp b/fpdfsdk/javascript/console.cpp
index ee7bc7f..d3528ee 100644
--- a/fpdfsdk/javascript/console.cpp
+++ b/fpdfsdk/javascript/console.cpp
@@ -24,7 +24,54 @@
                                            {"show", show_static},
                                            {0, 0}};
 
-IMPLEMENT_JS_CLASS(CJS_Console, console, console)
+const char* CJS_Console::g_pClassName = "console";
+int CJS_Console::g_nObjDefnID = -1;
+
+void CJS_Console::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_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::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_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);
+  DefineConsts(pEngine);
+  DefineProps(pEngine);
+  DefineMethods(pEngine);
+}
 
 console::console(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {}
 
