var person={name:'ninja'};
person.prototype.sayName=function(){return this.name;
}

分析上面这段代码,看看有没有问题?

没错,这段代码是有问题的,我们可以通过Chrome看一下执行结果:

错误提示说找不到sayName 属性,不是记得说Javascript可以随时新增属性的吗?没错,Javascript确实可以添加属性,但是不是针对对象实例本身的,而是针对其对实例对象所属的类型的对象的。是不是听起来有些别扭,没错,在Javascript的世界里,一切皆是对象,在其所属类型的对象里含有一个prototype的属性(这个prototype属性其实也是一个对象),而在类型的对象的实例的对象里,也存在一个__proto__的属性,这个属性其实可以理解为是prototype的一个引用。

这样说起来是不是有些难于理解,好的,那让我们重新整理一下上面的例子:

var Person=function(name){this.name=name;
};Person.prototype.sayName=function(){return this.name;
};var a_person=new Person('ninja');
var name=a_person.sayName();

在这个例子里Person就是类型的对象,a_person就是该类型对象的一个实例对象

现在我们在看一下这两个对象里属性的具体情况。

  1. 类型对象Person:在其中有一个属性prototype:Object,它是一个对象,其下面有一个Constructor的属性,对应的其实也就是当时定义该类型时候所写的function签名,也就是说这个Constructor其实是一个function类型,可以尝试用 typeof(Person.Constructor)测试一下,它的结果返回的是“function”.
  2. Person的实例对象a_person,下面有一个_proto_的属性,其实它也就是类型对象实例里prototype的一个引用,可以使用这样的代码去验证“Person.prototype===a_person.__proto__”,发现其结果返回的是true, 也许你会注意到在__proto__下面的属性里还有一个__proto__,这个其实就是link到了Object.Prototype了,这也就是常说的原型链的概念。

PS:

也许很多人会分不清在Javascript里面大写的Function和小写的function的区别

其实仔细分析一下代码,也不难发现,Function其实就是所有function的所属类型的一个对象。

是不是还是很拗口,其实原理也和上面一样,只不过这个Function的类型是Javascript自己定义的而已,来看一下代码吧:

从上面的截图中可以看出在prototype中已经定义了我们常常见到的一些方法appy,bind,call.

下面我们定义一个匿名方法,其实也就是Function的一个实例对象

我们看一下具体的构造:

发现了吧,它的__proto__其实就是Function里的引用:

细心的朋友应该会发现,当我们定义一个function类型对象后,展开它的属性我们会会看到两个prototype的相关的属性,一个是__proto__,另外一个是prototype;

正如前面所说__proto__是Function的prototype的引用;prototype是该类型对象本身的一个引用。

不知道读这篇文章的你是否搞明白了,我想我是已经明白了:)

转载于:https://www.cnblogs.com/shineqiujuan/p/3176786.html

细心看完这篇文章,刷新对Javascript Prototype的理解相关推荐

  1. [转帖]看完这篇文章你还敢说你懂JVM吗?

    看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...

  2. JVM难学?那是因为你没认真看完这篇文章

    JVM难学?那是因为你没认真看完这篇文章 一:虚拟机内存图解 JAVA程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理 ...

  3. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  4. 看完这篇文章之后,终于明白了编译到底怎么回事。

    看完这篇文章之后,终于明白了编译到底怎么回事. 1 对于同一个语句,有如下三种:高级语言.低级语言.机器语言的表示 C语言  a=b+1; 汇编语言  mov -0xc(%ebp),%eax add ...

  5. 看完这篇文章之后,终于明白了编译到底怎么回事

    看完这篇文章之后,终于明白了编译到底怎么回事. 1 对于同一个语句,有如下三种:高级语言.低级语言.机器语言的表示 C语言  a=b+1; 汇编语言  mov -0xc(%ebp),%eax add ...

  6. html5 游戏前景怎么样,独家 HTML5游戏目前究竟怎么样?看完这篇文章,你或许会清晰很多...

    原标题:独家 HTML5游戏目前究竟怎么样?看完这篇文章,你或许会清晰很多 文/DataEye CEO 汪祥斌 从5月份白鹭的10亿估值,到最近悟空间.山水地.火缘步甲的千万级以上的融资,我们可以感受 ...

  7. 手把手教你完成CSDN对接百度统计 看完这篇文章你还不会对接 欢迎您提刀顺着网线来砍我!!!!

    大家好,我是:じ☆ve朽木,开发经验都是一步一步慢慢积累的,没有谁生来就具有的,只要我们付出了努力,肯定就会有收获!进入我的博客,带你了解Java知识,js小技巧,带你玩转高端物联网.博客地址为:じ☆ ...

  8. 看完这篇文章,还不懂nginx,算我输

    看完这篇文章,还不懂nginx,算我输 参考:https://mp.weixin.qq.com/s/PeNWaCDf_6gp2fCQa0Gvng 1. Nginx产生~ Nginx 同 Apache ...

  9. java与python难度对比_Python和Java的区别,看完这篇文章你就清楚啦

    众所周知,在数不清的编程语言中Java自诞生之日起长盛不衰,可谓是神话般的存在.随着人工智能时代的到来,Python迅速席卷全球,作为当下最热门的编程语言,因其简单实用且应用场景广泛备受青睐. 一个是 ...

最新文章

  1. 程序员客栈携手野狗 体验国内领先的实时后端云协作
  2. java 定義json并賦值_java是值传递还是引用传递?
  3. Ftp上传类(FtpClient)
  4. 数据库基础操作(二)数据库表数据的增删查改
  5. 记一次LAMP环境搭建
  6. 蓝桥杯_算法训练_表达式计算
  7. C/C++中的拷贝构造函数和赋值构造函数
  8. 设计模式系列6:适配器模式(Adapter Pattern)
  9. 全球六大国际域名解析量统计报告(6月25日)
  10. Description Resource Path Location Type Java compiler level does not match the version of the insta
  11. 从小白到入门算法,我的经验分享给你~
  12. SPT20 协议_【笔试时间有变】关于国家电网三方协议的那些事!
  13. Linux系统下I/O操作讲解,深入了解实战高级I/O编程
  14. linux的dhcp配置命令,Linux下DHCP配置命令
  15. Linux版awvs最新版v_190325161的安装记录
  16. D92-02-ASEMI低压降快恢复二极管TO247封装
  17. 楼板计算塑形弹性_楼板计算的塑性铰线理论原理与运用详解.doc
  18. 正弦定理c语言,正弦定理练习题
  19. 石英晶振的基本原理与电路设计
  20. 我的经历——致岁月摧残的编程人生

热门文章

  1. 2022-2028年中国大气污染防治产业投资分析及前景预测报告
  2. 2022-2028年中国高纯锑行业市场全景研究及发展趋势分析报告
  3. 愿疫情早日过去,向那些在疫情战斗中牺牲的战士致敬
  4. 关于python导入模块和package的一些深度思考
  5. Springboot 多文件上传
  6. linux模拟器 cygwin源
  7. CPU Cache原理与示例
  8. MindSpore API编程概述
  9. 适用于Linux 2的Windows子系统上的CUDA
  10. Mybatis的各种查询功能