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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python win32api messagebox_如何在Python中使用Win32 API?

    python win32api messagebox_如何在Python中使用Win32 API?PyWin32是必经之路-但是如何使用它呢?一种方法是从遇到的具体问题开始并尝试解决它。PyWin32提供了许多Win32API函数的绑定,您确实必须首先选择一个特定的目标。在我的Python2.5安装中(在Windows上为ActiveState),win32软件包具有一个Demos文件夹,其中包含该库各个部分的示例代码。例如,这是CopyFileEx.py:importwin32file…

    2022年8月31日
    4
  • vsphere vsan配置_快船队最新消息

    vsphere vsan配置_快船队最新消息一直想抽空写写vSAN这个产品,在15年的时候笔者第一次听说vSAN这个产品,当时VMware还以VDI最佳拍档的方式去推广vSAN,短短两年的时间,vSAN经过多个版本的更新迭代,无论从功能还是稳定性上均有很大提升,最广泛的应用也由VDI变为了承载核心业务。这篇文章总结一下笔者对vSAN的一些学习和使用经验,简单介绍下vSAN,希望可以用最少的文字介绍清楚…

    2025年6月2日
    2
  • 动态创建数组[通俗易懂]

    动态创建数组[通俗易懂]使用运算符new也可以创建数组类型的对象,这时需要给出数组的结构说明。用new运算符动态创建一维数组的语法形式为:new类型名【数组长度】;其中数组长度指出了数组元素的个数,它可以是任何能够得到正整数值的表达式。细节:用new动态创建一维数组时,在方括号后仍然可以加小括号“()”,但小括号内不能带任何参数。是否加“()”的区别在于,不加“()”,则对数组每个元素的初始化,与执行

    2022年5月2日
    42
  • plotyy函数_plotyy函数参数设置[通俗易懂]

    plotyy函数_plotyy函数参数设置[通俗易懂][ax,h1,h2]=plotyy(x,a,x,sig0);set(ax,’Xlim’,[7.4,8.4],’XMinorGrid’,’on’)%设置x轴范围,并显示更细密的网格set(h1,’color’,’k’,’linewidth’,1);%设置y1的颜色为黑色,线宽为1set(h2,’color’,’r’,’linewidth’,1);%设置y2的颜色为红色,线宽为1set(get(ax(…

    2022年6月14日
    71
  • VS Code 必备插件推荐「建议收藏」

    VS Code 必备插件推荐「建议收藏」插件说明备注AutoCloseTag自动添加HTML/XML关闭标签AutoRenameTag自动重命名配对的HTML/XML标签Beautify格式化代码BracketPairColorizer颜色识别匹配括号CodeRunner非常强大的一款插件…

    2022年5月6日
    74
  • form factor_perform和performance的区别和用法

    form factor_perform和performance的区别和用法performSelector:withObject:是在iOS中的一种方法调用方式。他可以向一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以这也是runtime的一种应用方式。performSelector和直接调用方法的区别就在与runtime。直接调用编译是会自动校验。如果方法不存在,那么直接调用在编译时候就能够发现,编译器会直接报错。但是使用performSelec…

    2025年8月2日
    3

发表回复

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

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