深入理解JS—instanceof和原型链

xiaoxiao2021-02-27  306

又介绍一个老朋友——instanceof。

对于值类型,你可以通过typeof判断,string/number/boolean都很清楚,但是typeof在判断到引用类型的时候,返回值只有object/function,你不知道它到底是一个object对象,还是数组,还是new Number等等。

这个时候就需要用到instanceof。

例如:

function Foo(){} var f1=new Foo(); console.log(f1 instanceof Foo);//true console.log(f1 instanceof Object);//true

分析:Instanceof运算符的第一个变量是一个对象,暂时称为A;第二个变量一般是一个函数,暂时称为B。

Instanceof的判断队则是:沿着A的proto这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。这就很好地解释了上述代码的输出结果啦。

那么问题来了,Instanceof这样设计,到底有什么用?到底instanceof想表达什么呢?

重点就这样被这位老朋友给引出来了——继承——原型链。

原型链——instanceof表示的就是一种继承关系,或者原型链的结构。

要谈到原型链,首先必须谈到继承,在JS中,继承是通过原型链来体现出来的。

如:

function Foo(){} var f1=new Foo(); f1.a=10; Foo.prototype.a=100; Foo.prototype.b=200; console.log(f1.a);//10 console.log(f1.b);//200

以上代码中,f1是Foo函数new出来的对象,f1.a是f1对象的基本属性,f1.b是怎么来的呢?——从Foo.prototype得来,因为f1.proto指向的是Foo.prototype

访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着proto这条链向上找,这就是原型链。

看图说话:

那么我们在实际应用中如何区分一个属性到底是基本的还是从原型中找到的呢?大家可能都知道答案了——hasOwnProperty,特别是在for…in…循环中,一定要注意!!

那么f1为什么有hasOwnProperty方法?

其实呢,对象的原型链是沿着proto这条线走的,因此在查找f1.hasOwnProperty属性时,就会顺着原型链一直查找到Object.prototype。

由于所有的对象的原型链都会找到Object.prototype,因此所有的对象都会有Object.prototype的方法。这就是所谓的“继承”。

以上纯属通过学习后的个人理解,如有错误,请指正,谢谢!

转载请注明原文地址: https://www.6miu.com/read-1151.html

最新回复(0)