JavaScript - Symbol.hasInstance 属性



在 JavaScript 中,一个名为 Symbol.hasInstance 的唯一符号属性使对象能够指定当使用 instanceof 运算符时它们的行为方式。当 Symbol.hasInstance 作为对象上的方法指定时,它控制使用 instanceof 生成的实例在针对该对象进行测试时的行为。

通过使用此符号,用户定义的对象可以自定义 instanceof 运算符的行为,从而在决定对象是否为特定构造函数的实例方面拥有更大的自由度。

语法

以下是 JavaScript Symbol.hasInstance 属性的语法:

[Symbol.hasInstance](Object)

参数

此方法仅接受一个参数。下面描述了该参数:

  • object - 一个对象,它是构造函数之一。

返回值

如果该值位于对象的链中,则返回 true,否则返回 false。

示例

示例 1

让我们来看下面的示例,我们将为自定义类自定义 instanceof。

<html>
   <style>
      body {
         font-family: verdana;
         color: #DE3163;
      }
   </style>
   <body>
      <script>
         class x {
            static[Symbol.hasInstance](instance) {
               return Array.isArray(instance);
            }
         }
         const a = [11, 2, 33];
         document.write(a instanceof x);
      </script>
   </body>
</html>

如果我们执行上述程序,它将在网页上显示文本。

示例 2

考虑另一种情况,我们将为自定义对象自定义 instanceof。

<html>
   <style>
      body {
         font-family: verdana;
         color: #DE3163;
      }
   </style>
   <body>
      <script>
         function examp() {}
         const x = new examp();
         examp[Symbol.hasInstance] = function(instance) {
            return instance.constructor && instance.constructor.name === "TP";
         };
         document.write(x instanceof examp);
      </script>
   </body>
</html>

执行上述脚本后,它将在网页上显示文本。

示例 3

在下面的示例中,我们将使用带有 Symbol.hasInstance 属性的自定义构造函数。

<html>
   <style>
      body {
         font-family: verdana;
         color: #DE3163;
      }
   </style>
   <body>
      <script>
         function examp() {}
         examp[Symbol.hasInstance] = function(instance) {
            return instance instanceof examp && instance.isValid();
         };
         const x = new examp();
         document.write(x instanceof examp);
      </script>
   </body>
</html>

当我们执行脚本时,它将在网页上显示文本。

示例 4

以下是示例,我们将使用带有继承的 Symbol.hasInstance。

<html>
   <style>
      body {
         font-family: verdana;
         color: #DE3163;
      }
   </style>
   <body>
      <script>
         class x {
            static[Symbol.hasInstance](instance) {
               return 'dance' in instance && typeof instance.dance === 'function';
            }
         }
         class y {
            dance() {
               document.write("cat is dancing");
            }
         }
         let cat = new y();
         document.write(cat instanceof x);
      </script>
   </body>
</html>

执行上述脚本后,将弹出输出窗口,在网页上显示文本。

广告