先撸下类型判断运算符instanceof:
instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型。尽管它的用法不如typeof灵活,但是当typeof返回值是Object时,instanceof还是挺有用的,常用来判断继承关系。
是一个二元运算符,返回的是一个Boolean值,指出对象是否是特定类的一个实例。
expression instanceof class expression和class都是必选项。
关于function的arguments,一开始以为它是一个数组,因为它可以通过索引arguments[i],来访问参数列表,后来在使用push等方法时发现报错,
VM1621:3 Uncaught TypeError: arguments.push is not a function
arguments instanceof Array,返回值是false 这时得知arguments是一个Array-like对象,并不是真的数组。
class应该是js语法层面的bject,不应该是Dom对象,然而亲自尝试得
console.log(typeof window); //Objectconsole.log(window instanceof Object); //true |
---|
网上很多文章都说window instanceof Object返回是false,不知为啥。
通常用来判断一个实例是否属于某种类型。
function Foo(){}var foo = new Foo(); console.log(foo instanceof Foo) //true |
---|
更重要的是用来判断继承关系。
function A() {}function B() {}B.prototype = new A(); //原型继承var b = new B();console.log(b instanceof B); //trueconsole.log(b instanceof A); //true |
---|
多层继承关系依然适用。
console.log(Object instanceof Object); //trueconsole.log(Function instanceof Function); //trueconsole.log(Number instanceof Number); //falseconsole.log(String instanceof String); //falseconsole.log(Function instanceof Object); //trueconsole.log(Foo instanceof Function); //trueconsole.log(Foo instanceof Foo); //false |
---|
参考网上的文章,就是这一篇,得知要从两个方面着手:
---- 选择性屏蔽线 ----
---- 选择性屏蔽线 ----
上面的规范定义很晦涩,而且看起来比较复杂,涉及到很多概念,但把这段规范翻译成 JavaScript 代码却很简单,如下:
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式 var O = R.prototype;// 取 R 的显示原型 L = L.__proto__;// 取 L 的隐式原型 while (true) { if (L === null) return false; if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true return true; L = L.__proto__; }} |
---|
当当当当,BB一大片,这才是精华。其实判断继承关系,搞懂下面这张图就ok。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。