当前位置: 首页 > news >正文

八 原型prototype和__proto__

先来看一个实例

function Foo() {
}
var foo = new Foo();

console. log( foo. prototype); // undefined
console. log( foo. __proto__ === Foo. prototype); // true
console. log( Foo. __proto__);    [Function]

Foo.__proto__结果如下:

 

console. log( Foo. prototype); // [object Object]

Foo.prototype结果如下:

 

console. log( Foo. prototype. prototype); // undefined

 

实例说明了:

 

1、 foo 是 Foo 的一个实例,不是一个函数,所以没有prototype

   FooFunction的一个实例,而Function是一个函数,他的实例Foo也是一个函数,所以他们都有prototype。此外Object Array RegExp等也是函数。Math就仅仅是一个new Object() ,不是函数。

2、构造函数的prototype,默认情况下就是一个new Object()还额外添加了一个constructor属性。所以说默认是没有prototype只有__proto__的。

除了Object.prototype这个对象,其他所有的对象都会有__proto__属性,之后函数才会有prototype属性。

在创建对象的时候会自动创建一个__proto__属性,指向它构造函数的prototype,当访问这个对象的属性的时候会顺带访问__proto__中对应的属性,也就是构造函数prototype这样实现了继承。
只有创建函数的时候才会创建一个prototype属性,目的就是为了完成上面的继承方式。

总结:

<1>不管是普通对象还是函数对象,它们都有一个隐含属性”__proto__ “,而这属性就是我们通常说的原型(属性),它其实就是一个Object类型的对象。

<2>对于函数对象,它们还会多一个prototype的属性,它和以它为构造函数创建的普通对象的”__proto__ “属性等同,即"new XXXt().__proto__ ===XXX.prototype"为true,即对象XXX中都有__proto__属性就是一个指针,指向XXX构造函数中的prototype属性。

<3> 

<4>

<5>

摘录网上

一个图(橙色箭头是初始的关系,绿色是执行 var Fish = new Fu... 创建,蓝色是执行f1= new Fish()创建。)


这样f1 就可以通过__proto__ 访问 Fish.prototype中的属性(当然这是程序执行的时候自动查找的)。Fish就可以访问 Function.prototype定义的属性。所有对象都可以访问Object.prototype 中的属性。

 

转载于:https://www.cnblogs.com/jadeshu/p/10663656.html

相关文章:

  • SQL存储过程解密
  • 数据库可视化工具简介以及pymysql的使用
  • Mysql-慢查询日志
  • ztree异步加载树节点
  • 分页插件PageHelper配置步骤(mybatis)
  • 快速排序的C++版
  • 新建存过,查询表结构的方法。
  • 金额转换问题
  • jquery-5 jQuery筛选选择器
  • kettle学习笔记(九)——子转换、集群与变量
  • Django初始配置及大概扫阅
  • [转载]Delphi 版 everything、光速搜索代码
  • OO第四次博客作业
  • CentOS7网卡重启错误,配置IP方案
  • 真·面试题
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 2018一半小结一波
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android单元测试 - 几个重要问题
  • Apache Spark Streaming 使用实例
  • C++入门教程(10):for 语句
  • JavaScript函数式编程(一)
  • Linux gpio口使用方法
  • mysql 数据库四种事务隔离级别
  • nfs客户端进程变D,延伸linux的lock
  • Sublime Text 2/3 绑定Eclipse快捷键
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 分布式熔断降级平台aegis
  • 浮动相关
  • 搞机器学习要哪些技能
  • 关于List、List?、ListObject的区别
  • 简单数学运算程序(不定期更新)
  • 七牛云假注销小指南
  • 听说你叫Java(二)–Servlet请求
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 白色的风信子
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (06)Hive——正则表达式
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (六)激光线扫描-三维重建
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)Mysql的优化设置
  • (转载)hibernate缓存
  • .cn根服务器被攻击之后
  • .gitignore文件---让git自动忽略指定文件
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net网站发布-允许更新此预编译站点
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @property python知乎_Python3基础之:property
  • @Transactional 竟也能解决分布式事务?
  • []T 还是 []*T, 这是一个问题