js-函数的prototype

js-函数的prototypeDockerfile

大家好,又见面了,我是你们的朋友全栈君。

1、 函数的prototype属性

  • 每个 函数 都有一个prototype属性(是一个object类型数据),它默认指向一个object空对象(即称为:原型对象)
 console.log(typeof Date.prototype) //object
 console.log(Date.prototype) //如图1所示
 function fun(){ 
   }
 console.log(fun.prototype)   //默认指向一个object空对象(没有我们的属性)

在这里插入图片描述图1
在这里插入图片描述图2

/* Date函数的流程基本就是 首先创建一个Date函数, 然后通过Date.prototype(指向原型对象)向Date函数原型对象中添加很多方法 如下:以函数fun为例 */
 function fun(){ 
   }
 fun.prototype.test = function(){ 
   }
  console.log(fun.prototype)

在这里插入图片描述

  • 原型对象中有一个属性constructor,他指向函数对象
// 原型对象中有一个属性constructor,他指向函数对象
console.log(Date.prototype.constructor === Date)  // true
console.log(fun.prototype.constructor === fun)  // true

2、 给原型对象添加属性(一般都是方法)

  • 作用:函数的所有实例对象自动拥有原型中的属性(方法)
/* 给原型对象添加属性(一般都是方法)===》实例对象可以访问 */
 function Fun(){ 
   }
 Fun.prototype.test = function(){ 
   
 console.log('test()')
}
var fun =  new Fun() // 实例化对象
fun.test() //test() 实例对象可以直接访问

3、 显式原型与隐式原型

  • 每个函数function都有一个prototype,即显式原型
  • 每个实例对象都有一个__proto__,即隐式原型
  • 对象的隐式原型的值为其对应的构造函数的显式原型的值
/* 每个**函数function**都有一个prototype,即显式原型,默认指向一个object空对象 */
function Fn(){ 
        //内部语句:this.prototype = {}
}
console.log(Fn.prototype)
/* 每个**实例对象**都有一个__proto__,即隐式原型,默认指向一个object空对象 */
var fn =  new Fn() // 实例化对象,内部语句:this.__proto__ = Fn.prototype
console.log(fn.__proto__)

/* 对象的隐式原型的值为其对应的构造函数的显式原型的值,引用地址值相同,指向同一个对象 */
console.log(Fn.prototype === fn.__proto__)   //true


Fn.prototype.test = function(){ 
   
console.log('test()')
}
fn.test()   // test() 对象可以直接访问自己__proto__里面的属性和方法,本质上 对象的__proto__与其构造函数的prototype 指向的是同一个对象

在这里插入图片描述

  • 内存结构
    在这里插入图片描述
  • 总结:
    (1)对象的prototype属性:在定义函数时自动添加的,默认值是一个空object对象
    (2)对象的__proto__属性:创建对象时自动添加的,默认值是构造函数的prototype属性值
    (3)程序员可直接操作显式原型,但不能操作隐式原型(es6之前)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ioctl之FIONREAD

    ioctl之FIONREAD在学习ioctl时常常跟read,write混淆。其实ioctl是用来设置硬件控制寄存器,或者读取硬件状态寄存器的数值之类的。而read,write是把数据丢入缓冲区,硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区。 ioctl(keyFd,FIONREAD,&b)得到缓冲区里有多少字节要被读取,然后将字节数放入b里面。接下来就可以

    2022年7月23日
    17
  • 动手实操丨RC522射频卡模块与IC卡完成充值消费查询的技术实现思路

    动手实操丨RC522射频卡模块与IC卡完成充值消费查询的技术实现思路一文手把手教你利用RC522射频卡模块与IC卡完成充值消费查询的技术实现思路。

    2022年7月26日
    6
  • 博客园学习的好地方

    VisualStudio2015Update1安装失败当你安装VisualStudio2015Update1时,安装程序失败并记录“BITS作业失败”的错误消息Visual

    2021年12月21日
    53
  • String.padStart实际如何工作?

    String.padStart实际如何工作?Previously,IsharedmyusageofpadStarttoelegantlyreplacewhatwould’vebeenloadsofifstatements.Thismagicalmethodthrewmeoffmyrocker.Isimplycouldn’tbelieveitexisted.以前,我分享了pad…

    2022年9月9日
    4
  • 加壳工具的使用

    加壳工具的使用加壳工具的使用0x01前言0x01加壳简介0x02ASPack加壳0x03PE-Armor加壳0x01前言这是我对加壳工具的使用的学习记录。0x01加壳简介1.加壳:是一种通过一系列数学运算,将可执行程序文件(EXE)或动态链接库文件(DLL)的编码进行改变(目前加壳软件还可以压缩、加密),以达到缩小文件体积或加密程序编码的目的。当被加壳的程序运行时,外壳程序先被执行,然后由这…

    2022年6月27日
    30
  • Mac idea激活码【2022免费激活】2022.02.20

    (Mac idea激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlLGWSVFD4PZ-eyJsaWN…

    2022年4月1日
    828

发表回复

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

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