返回顶部
首页 > 资讯 > 精选 >如何理解JavaScript原型链和instanceof运算符的关系
  • 377
分享到

如何理解JavaScript原型链和instanceof运算符的关系

2023-06-17 06:06:11 377人浏览 薄情痞子
摘要

如何理解javascript原型链和instanceof运算符的暧昧关系,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。时间回到两个月前,简单地理了理原型链、prototype以

如何理解javascript原型链和instanceof运算符的暧昧关系,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

时间回到两个月前,简单地理了理原型链、prototype以及__proto__之间的乱七八糟的关系,同时也简单了解了下typeof和instanceof两个运算符,但是,anyway,试试以下两题:

console.log(Function instanceof Function);
console.log(String instanceof String);

如果无法得出准确答案,跟着楼主一起温故而知新吧。

温故

我们经常用typeof运算符来判断一个变量的类型,也确实挺好用,能判断出number、boolean、string,但是对于 object的判断能力一般,比如Array和null的判断结果都是object,而且对于new的一些对象,比如new String(),new Number()等的结果都是object,这样下来就有个问题,无法更细致地判断对象实例,这时就需要instanceof出马了。顾名思 义,instanceof是判断一个对象是否为某一构造函数实例的运算符,这样下来,对于new出来的变量,到底是number、string还是别的什 么玩意,就有了进一步的判断认识了。看起来很简单,其实不然,上面的两题就是小试牛刀了,先放着,再来回顾下原型链。

JavaScript中一切皆为对象,所有对象都有个__proto__属性值(即原型),可能某些坑爹浏览器下不支持,暂且不管,某对象的该 属性的取值是该对象的构造函数的prototype值,作用就是对于某一个类型的对象,不用重复定义某种方法,譬如说对于对象[1,2,3],显然这是个 数组对象,它具有pop、push等方法,但是并不是说它本身就具有这些方法,而是它的构造函数Array函数所具有,而该对象的__proto__取值 就是Array函数的prototype值,so如果本身并不具有pop方法,就会从它的__proto__中寻找,即所谓的原型链;而该条链的末端就是 Object,因为一切对象都是由Object构造而成,而Object.prototype.__proto__规定指向null。

文字的描述永远是苍白无力的,举个简单的例子:

  1. var fun = function(){ 

  2.   this.a = 1; 

  3. }; 

  4.   

  5. fun.prototype.b = 2; 

  6. var obj = new fun(); 

  7. obj.a; //1 

  8. obj.b; //2

如何理解JavaScript原型链和instanceof运算符的关系

网上盗的例子和图,仔细看就会发现说的很清楚。

知新

接下来看看instanceof运算符。

instanceof的常规用法是判断a是否是b类型:

console.log(true instanceof Boolean); // false  console.log(new Number(1) instanceof Number); // true

instanceof还能判断父类型:

function Father() {} function Child() {} Child.prototype = new Father(); var a = new Child(); console.log(a instanceof Child);  // true console.log(a instanceof Father); // true

Child构造函数继承自Father,实例a是Child构造的无疑,但是为何也是Father的实例呢?其实instanceof运算符的内核可以简单地用以下代码描述:

function check(a, b) {   while(a.__proto__) {     if(a.__proto__ === b.prototype)       return true;     a = a.__proto__;   }   return false; } function Foo() {} console.log(Object instanceof Object === check(Object, Object)); // true console.log(Function instanceof Function === check(Function, Function)); // true console.log(Number instanceof Number === check(Number, Number)); // true console.log(String instanceof String === check(String, String)); // true console.log(Function instanceof Object === check(Function, Object)); // true console.log(Foo instanceof Function === check(Foo, Function)); // true console.log(Foo instanceof Foo === check(Foo, Foo)); // true

简单地说,a如果是b的实例,那么a肯定能使用b的prototype中定义的方法和属性,那么用代码表示就是a的原型链中有b.prototype取值相同的对象,于是顺着a的原型链一层层找就行了。

另外值得注意的是,String Number Boolean 以及Function等都是函数,而函数则是统一由Function构造而来的,so它们和任何单纯的函数一样,能用Function上的原型属性:

Function.prototype.a = 10; console.log(String.a);  // 10

***来简单讲讲最开始的两道题吧。

// 为了方便表述,首先区分左侧表达式和右侧表达式 FunctionL = Function, FunctionR = Function; // 下面根据规范逐步推演 O = FunctionR.prototype = Function.prototype L = FunctionL.__proto__ = Function.prototype // ***次判断 O == L // 返回 true
// 为了方便表述,首先区分左侧表达式和右侧表达式 StringL = String, StringR = String; // 下面根据规范逐步推演 O = StringR.prototype = String.prototype L = StringL.__proto__ = Function.prototype // ***次判断 O != L // 循环再次查找 L 是否还有 __proto__ L = String.prototype.__proto__ = Object.prototype // 第二次判断 O != L // 再次循环查找 L 是否还有 __proto__ L = String.prototype.__proto__ = null // 第三次判断 L == null // 返回 false

看完上述内容,你们掌握如何理解JavaScript原型链和instanceof运算符的暧昧关系的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何理解JavaScript原型链和instanceof运算符的关系

本文链接: https://lsjlt.com/news/287554.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解JavaScript原型链和instanceof运算符的关系
    如何理解JavaScript原型链和instanceof运算符的暧昧关系,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。时间回到两个月前,简单地理了理原型链、prototype以...
    99+
    2023-06-17
  • 如何理解JavaScript中的原型与原型链
    本篇文章给大家分享的是有关如何理解JavaScript中的原型与原型链,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。原型和原型链关系贯穿Jav...
    99+
    2024-04-02
  • 如何理解JavaScript运算符
    这篇文章主要介绍“如何理解JavaScript运算符”,在日常操作中,相信很多人在如何理解JavaScript运算符问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Ja...
    99+
    2024-04-02
  • JavaScript中的原型和原型链怎么理解
    这篇文章主要介绍“JavaScript中的原型和原型链怎么理解”,在日常操作中,相信很多人在JavaScript中的原型和原型链怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • JavaScript原型和原型链与构造函数和实例之间的关系详解
    目录原型原型链原型 如图所示: 1.instanceof检测构造函数与实例的关系: function Person () {.........} person = new Pers...
    99+
    2024-04-02
  • JavaScript ES6解构运算符的理解和运用
    目录前言解构符号的作用使用方法解构赋值的应用浅谈应用提取json数据可扩展运算符...交换变量值总结前言 最近一直在学JavaScript,看到了ES6中的解构符号,觉得这个给我们...
    99+
    2024-04-02
  • 如何理解javascript三目运算符
    这篇文章主要介绍“如何理解javascript三目运算符”,在日常操作中,相信很多人在如何理解javascript三目运算符问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何...
    99+
    2024-04-02
  • Javascript运算符和数据类型如何转换
    本篇内容主要讲解“Javascript运算符和数据类型如何转换”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript运算符和数据类型如何转换”吧! ...
    99+
    2024-04-02
  • JavaScript原型链中函数和对象的理解
    目录__ proto__prototype.__ proto__理解__ proto__ 最近在看高程4,原型链肯定是绕不过的,本瓜之前一直认为,只要记住这句话就可以了: 一个对象的...
    99+
    2024-04-02
  • 如何理解JavaScript各类型的关系
    如何理解JavaScript各类型的关系,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。这个图来自于《JavaScript语言精...
    99+
    2024-04-02
  • 如何理解javascript原型链与作用域的问题
    这期内容当中小编将会给大家带来有关如何理解javascript原型链与作用域的问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。众所周知,js不像其他OOP语言那样,他是...
    99+
    2024-04-02
  • 如何理解Javascript的连续赋值运算
    这篇文章将为大家详细讲解有关如何理解Javascript的连续赋值运算,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。小编将分享一下作者在写Javascrip...
    99+
    2024-04-02
  • 如何理解C ++中的范围解析运算符
    本篇内容介绍了“如何理解C ++中的范围解析运算符”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.当存在具有相同名称的局部变量时,要访问全...
    99+
    2023-06-16
  • 如何快速理解C ++中的运算符重载
    本篇内容主要讲解“如何快速理解C ++中的运算符重载”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何快速理解C ++中的运算符重载”吧!在C ++中,我们可以...
    99+
    2024-04-02
  • 如何理解VB.NET串联运算符的两种应用方式
    今天就跟大家聊聊有关如何理解VB.NET串联运算符的两种应用方式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。我们今天先来了解一下VB.NET串联运算符的相关应用技巧,提高自己对这门...
    99+
    2023-06-17
  • 如何理解关系型数据库的约束机制
    这篇文章将为大家详细讲解有关如何理解关系型数据库的约束机制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一. 关系型数据库市场上主流的关系型数据库:Orac...
    99+
    2024-04-02
  • 如何深入理解关系型数据库的三大范式
    该文章,GitHub已收录,欢迎老板们前来Star! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual 数据库范式 一、什么是数据库范式 设计关系数据库时...
    99+
    2018-01-24
    如何深入理解关系型数据库的三大范式
  • 加法、减法、乘法和除法运算符如何处理表示为 MySQL 字符串的日期?
    此类计算可能会导致不可预测的结果,因为当日期表示为 MySQL 字符串时,MySQL 会尝试仅采用第一个出现的字符串来对字符串执行数字运算。以下示例将阐明它 -mysql> select '2017-10-17' + ...
    99+
    2023-10-22
  • 如何理解CSS Font-Size: em、px 、pt 、Percent之间的关系及换算
    本篇内容主要讲解“如何理解CSS Font-Size: em、px 、pt 、Percent之间的关系及换算”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理...
    99+
    2024-04-02
  • 如何理解操作系统中的Hosts文件工作原理和作用
    本篇内容介绍了“如何理解操作系统中的Hosts文件工作原理和作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是Hosts文件?Ho...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作