JS中的原型和原型链(图解)

JS中的原型和原型链(图解)JS 中的原型和原型链讲原型的时候 我们应该先要记住以下几个要点 这几个要点是理解原型的关键 1 所有的引用类型 数组 函数 对象 可以自由扩展属性 除 null 以外 2 所有的引用类型都有一个 proto 属性 也叫隐式原型 它是一个普通的对象 3 所有的函数都有一个 prototype 属性 这也叫显式原型 它也是一个普通的对象

JS中的原型和原型链

讲原型的时候,我们应该先要记住以下几个要点,这几个要点是理解原型的关键

1、所有的引用类型(数组、函数、对象)可以自由扩展属性(除null以外)。

2、所有的引用类型都有一个’_ _ proto_ _’属性(也叫隐式原型,它是一个普通的对象)。

3、所有的函数都有一个’prototype’属性(这也叫显式原型,它也是一个普通的对象)。

4、所有引用类型,它的’_ _ proto_ _’属性指向它的构造函数的’prototype’属性。

5、当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它的’_ _ proto_ _’属性(也就是它的构造函数的’prototype’属性)中去寻找。


那么要点说完了,我们就根据这些要点来理解原型和原型链。

原型

我们先来看一个原型的例子。

 //这是一个构造函数 function Foo(name,age){ this.name=name; this.age=age; } /*根据要点3,所有的函数都有一个prototype属性,这个属性是一个对象 再根据要点1,所有的对象可以自由扩展属性 于是就有了以下写法*/ Foo.prototype={ // prototype对象里面又有其他的属性 showName:function(){ console.log("I'm "+this.name);//this是什么要看执行的时候谁调用了这个函数 }, showAge:function(){ console.log("And I'm "+this.age);//this是什么要看执行的时候谁调用了这个函数 } } var fn=new Foo('小明',19) /*当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它 构造函数的'prototype'属性中去找*/ fn.showName(); //I'm 小明 fn.showAge(); //And I'm 19 

这就是原型,很好理解。那为什么要使用原型呢?

试想如果我们要通过Foo()来创建很多很多个对象,如果我们是这样子写的话:

 function Foo(name,age){ this.name=name; this.age=age; this.showName=function(){ console.log("I'm "+this.name); } this.showAge=function(){ console.log("And I'm "+this.age); } } 

原型链

理解了原型,那么原型链就更好理解了。

下面这段话可以帮助理解原型链

根据要点5,当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它构造函数的’prototype’属性中去寻找。那又因为’prototype’属性是一个对象,所以它也有一个’_ _ proto_ _’属性。

那么我们来看一个例子:

 // 构造函数 function Foo(name,age){ this.name=name; this.age=age; } Object.prototype.toString=function(){ //this是什么要看执行的时候谁调用了这个函数。 console.log("I'm "+this.name+" And I'm "+this.age); } var fn=new Foo('小明',19); fn.toString(); //I'm 小明 And I'm 19 console.log(fn.toString===Foo.prototype.__proto__.toString); //true console.log(fn.__proto__ ===Foo.prototype)//true console.log(Foo.prototype.__proto__===Object.prototype)//true console.log(Object.prototype.__proto__===null)//true 

这就是原型链,fn能够调用Object.prototype中的方法正是因为存在原型链的机制。

另外,在使用原型的时候,一般推荐将需要扩展的方法写在构造函数的prototype属性中,避免写在_ _ proto _ _属性里面。

朋友们如果看懂了留个赞呗 ?,不懂可以在评论区留言。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199146.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午1:44
下一篇 2026年3月26日 下午1:45


相关推荐

  • windows下安装python及第三方库numpy、scipy、matplotlib终极版[通俗易懂]

    一、python安装进入python官网https://www.python.org/,点击Downloads–Windows下载对应的python2.7或者3.6。点击其中一个版本进入下一个界面,选择64Windowsx86-64MSIinstaller或者32位Windowsx86MSIinstaller进行下载。下载点击安装,默认安装位置是C盘根目录C…

    2022年4月11日
    158
  • 浅聊:ES6模板字符串与一般字符串

    浅聊:ES6模板字符串与一般字符串一.模板字符串与一般字符串区别二.模板字符串的一些注意事项一.模板字符串与一般字符串区别1,认识模板字符串:’xiaozhang’ //一般字符串`xiaozhang` //模板字符串(用两个反引号裹着)constusername1=’xiaozhang’;constusername2=`xiaozhang`;console.log(username1,username2,usern..

    2022年8月21日
    18
  • mysql查看数据库端口(sqlserver数据库端口查看)

    默认端口为3306,也可以执行以下命令查询:showglobalvariableslike’port’;

    2022年4月10日
    39
  • (转载)LaTeX实战经验:从零开始快速入门

    (转载)LaTeX实战经验:从零开始快速入门对于理工科的学生来说,尤其是从研究生阶段开始,LaTeX应该会是日常中必不可少的写作工具。毕竟要写什么公式的话,不用LaTeX实在是不知道要怎么办。况且要是投稍微专业一点的论文,LaTeX是必须的,没人会接收Word文件。此篇为写给一些想快速入门LaTeX的朋友,至于为什么要叫从零开始,因为我就是从零开始学会的LaTeX。如果你不是那么“聪慧”,LaTeX可能的学习曲线会显得比较曲折。但熟能生…

    2022年5月25日
    115
  • Tomcat日志管理(一)[通俗易懂]

    Tomcat日志管理(一)[通俗易懂]官方文档地址:http://tomcat.apache.org/tomcat-7.0-doc/logging.htmlTomcatJULITomcat的日志管理功能是借助于ApacheCommonsLogging库来实现的,该库对当今几个流行的日志框架的精简和封装,从而使得Tomcat日志管理不必依赖于某一个具体的日志框架。从Tomcat6.0开始,Tomcat内的Apache…

    2022年5月22日
    39
  • OIDC认证+授权

    OIDC认证+授权五分钟理解什么是 OIDC OpenIDConnec 什么是 OIDC OIDC 的全称是 OpenIDConnec 是一套基于 OAuth2 0 的认证 授权协议 用于用户身份认证 将用户数据安全地暴露给第三方 OIDC 与 OAuth2 0 有何不同 OAuth2 0 是用于授权的行业标准协议 OAuth2 0 致力于简化客户端开发人员的工作 同时为 Web 应用程序 桌面应用程序 移动电话和物联网设备提供特定的授权流程 以上是 OAuth2 0 的官方定义 我们举一

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号