我知道可以剪切Symbol.hasInstance个属性来判断对象是否是特定类的实例.但我不明白这是怎么回事?

class Animal {
 static [Symbol.hasInstance](obj){ // how is this obj being passes here on calling the function below
    if(obj.isAnimal) return true
 }
}

const a1 = new Animal();
console.log(a1 instanceOf Animal) // false 
a1.isAnimal = true
console.log(a1 instanceOf Animal) // true 

Question:调用a1 instanceOf Animal时如何将obj传递给静态函数

推荐答案

很多时候,即使代码中没有在属性名后()秒显式调用函数的内容,也可以调用函数.例如,对于迭代器:

class C {
  *[Symbol.iterator]() {
    for (let i = 0; i < 3; i++) yield i;
  }
}
const c = new C();
for (const item of c) {
  console.log(item);
}

和类型强制:

const obj = {
  toString: () => 'some obj'
};
console.log(String(obj));

和代理.

const prox = new Proxy({}, {
  has() {
    console.log('has invoked');
    return true;
  }
});
console.log('foo' in prox);

instanceof只是这些情况中的另一种.

x instanceof y is specified to首先从y中提取hasInstance符号处的值,如果存在这样的值:

  1. 让instOfHandlergo 吧?GetMethod(目标,@@hasInstance).

然后用x调用.如果该值不存在,则将使用xy调用OrdinaryHasInstance.这就是它的全部内容——根据定义,instanceof将查找并try 调用Symbol.hasInstance属性(如果有).

对于几乎所有的运算符,您可以将x someOperator y视为使用xy调用someOperator,并且该运算符通常在后台使用操作数执行许多操作.

Javascript相关问答推荐

我不知道为什么setwritten包装promise 不能像我预期的那样工作

用JavaScript复制C#CRC 32生成器

自定义高图中的x轴标签序列

WebGL 2.0无符号整数输入变量

如何调用名称在字符串中的实例方法?

如何在Angular拖放组件中同步数组?

如何在DYGRAPS中更改鼠标事件和键盘输入

如何访问此数组中的值?

如何在一个对象Java脚本中获取不同键的重复值?

不同表的条件API端点Reaction-redux

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

按特定顺序将4个数组组合在一起,按ID分组

bootstrap S JS赢得了REACT中的函数/加载

为什么我的SoupRequest";被重置为初始值,以及如何修复它?

JQuery使用选项填充HTMLSELECT并设置默认结果,默认结果显示为空

使用Library chart.js在一个带有两个y轴的图表中绘制两个数据集

如果查询为空,则MongoDB将所有文档与$in匹配

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

JSON Web令牌(JWT)错误:RSA密钥对的签名无效

JS/css:将数字输入的S函数和可调整大小的元素S函数绑定在一起