JavaScript中symbol对象中方法的知识梳理

时间:2021-1-8 作者:admin

1.Symbol.hasInstance

每一个函数都有一个Symbol.hasInstance, 用于确定某个对象是否为该函数的事例。该方法在Function.prototype中定义,所以所有的函数都有该方法。而且为了确保该方法不会被意外重写,该方法writable:false, enumerable: false, configurable: false。

本质上就是es6 将 instanceof重新定义为Symbol.hasInstance的简单语法。

obj instanceof Array

等价于

Array[Symbol.hasInstance](obj)

mdn上说:

Symbol.hasInstance 用于判断某对象是否为某构造器的实例。 因此你可以用它自定义 instanceof 操作符在某个类上的行为。

我的理解是 Symbol.hasinstance 为用户提供了可以为自己实现的某个类重新定义instanceof的判断逻辑以及运行方式了。

那么问题来了instanceof原来的默认执行逻辑 是什么样的呢? 此处参考了这个boy的博客

instanceof 在mdn中的定义为

object instanceof constructor

左边是要测试的对象,右边是构造函数 是否能在对象的原型链上(顺着__proto__一直往上找)找到构造函数的原型属性([constructor].prototype)。

举个例子

[] instanceof Array // true

[] instanceof Object //true

第一个很容易

[].__proto__ = Array.prototype

第二个

[].__proto__ = Array.prototype; // 没有找到的话,继续向原型链上找 直到找不到为止 Array.prototype.__proto = Object.prototype

再来一个

Function instanceof Object Object instanceof Object Object instanceof Function

第一个

Function.__proto__ = Function.prototype 没有找到的话,继续向原型链上找 直到找不到为止 Function.prototype.__proto__ = Object.prototype

第二个

Object.__proto__ = Function.prototype Function.prototype.__proto__ = Object.prototype

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。