diff --git a/crates/cli-support/src/js/mod.rs b/crates/cli-support/src/js/mod.rs
index f6723659..e1e9d8a3 100644
--- a/crates/cli-support/src/js/mod.rs
+++ b/crates/cli-support/src/js/mod.rs
@@ -1817,8 +1817,9 @@ impl<'a, 'b> SubContext<'a, 'b> {
                         if import.structural {
                             format!(
                                 "function() {{
-                                    return this.{};
+                                    return {}.{};
                                 }}",
+                                if is_static { &class } else { "this" },
                                 g
                             )
                         } else {
@@ -1835,8 +1836,9 @@ impl<'a, 'b> SubContext<'a, 'b> {
                         if import.structural {
                             format!(
                                 "function(y) {{
-                                this.{} = y;
+                                {}.{} = y;
                             }}",
+                                if is_static { &class } else { "this" },
                                 s
                             )
                         } else {
diff --git a/src/js.rs b/src/js.rs
index 4a42626a..ff2d5eae 100644
--- a/src/js.rs
+++ b/src/js.rs
@@ -1388,3 +1388,17 @@ if_std! {
         }
     }
 }
+
+// Symbol
+#[wasm_bindgen]
+extern "C" {
+    pub type Symbol;
+
+    /// The Symbol.hasInstance well-known symbol is used to determine
+    /// if a constructor object recognizes an object as its instance.
+    /// The instanceof operator's behavior can be customized by this symbol.
+    ///
+    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance
+    #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = hasInstance)]
+    pub fn has_instance() -> Symbol;
+}
diff --git a/tests/all/js_globals/Symbol.rs b/tests/all/js_globals/Symbol.rs
new file mode 100644
index 00000000..74003089
--- /dev/null
+++ b/tests/all/js_globals/Symbol.rs
@@ -0,0 +1,42 @@
+#![allow(non_snake_case)]
+
+use project;
+
+#[test]
+fn has_instance() {
+    project()
+        .file(
+            "src/lib.rs",
+            r#"
+            #![feature(proc_macro, wasm_custom_section)]
+
+            extern crate wasm_bindgen;
+            use wasm_bindgen::prelude::*;
+            use wasm_bindgen::js;
+
+            #[wasm_bindgen]
+            pub fn symbol_has_instance() -> js::Symbol {
+                js::Symbol::has_instance()
+            }
+
+        "#,
+        )
+        .file(
+            "test.js",
+            r#"
+            import * as assert from "assert";
+            import * as wasm from "./out";
+            class Array1 {
+                static [wasm.symbol_has_instance()](instance) {
+                    return Array.isArray(instance);
+                }
+            }
+
+            export function test() {
+                assert.equal(typeof wasm.symbol_has_instance(), "symbol");
+                assert.ok([] instanceof Array1);
+            }
+        "#,
+        )
+        .test()
+}
diff --git a/tests/all/js_globals/mod.rs b/tests/all/js_globals/mod.rs
index ee786dda..633372e0 100644
--- a/tests/all/js_globals/mod.rs
+++ b/tests/all/js_globals/mod.rs
@@ -19,6 +19,7 @@ mod Object;
 mod Proxy;
 mod Set;
 mod SetIterator;
+mod Symbol;
 mod TypedArray;
 mod WeakMap;
 mod WeakSet;