js prototype和__proto__的关系是什么


Posted in Javascript onAugust 23, 2019

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。(这个对象下面有个属性,这个属性是另外一个对象的应用 ,这个属性就是一个对象。)

function是对象,function的原型prototype也是对象,它们都会具有对象共有的特点。即:对象具有属性__proto__,每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。__proto__可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。

funcition这个特殊的对象,除了和其他对象一样有上述_proto_属性之外,还有自己特有的属性——原型属性(prototype),这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。prototype是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。

ptototype和__proto__联系

prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有一个prototype属性,指向该函数的原型对象,同样任意一个构造函数实例化的对象,都有一个__proto__属性(__proto__并非标准属性,ECMA-262第5版将该属性或指针称为[[Prototype]],可通过Object.getPrototypeOf()标准方法访问该属性),指向构造函数的原型对象。---sinのstone

ptototype和__proto__区别

//a作为构造函数时的prototype属性与a作为普通函数时的__proto__属性并不相等
console.log(a.prototype == a.__proto__);//false

console.log(a.__proto__);     //function (){}
console.log(a.__proto__ == Function.prototype);//true

//a作为一个普通函数调用时,它的构造函数是内置对象Function,所以它指向的原型对象,就是Function.prototype.
//其实这个和console.log(b.__proto__ == a.prototype)是一样的道理

//a作为构造函数时,它的原型,和它的原型的原型
console.log(a.prototype);          //a{}
console.log(a.prototype.__proto__); //Object{}

//a作为普通函数时,它原型的原型
console.log(a.__proto__.__proto__); //Object{}

console.log(a.__proto__.__proto__ == a.prototype.__proto__); //true

所有对象都有__proto__属性,函数这个特殊对象除了具有__proto__属性,还有特有的原型属性prototype。prototype对象默认有两个属性,constructor属性和__proto__属性。prototype属性可以给函数和对象添加可共享(继承)的方法、属性,而__proto__是查找某函数或对象的原型链方式。constructor,这个属性包含了一个指针,指回原构造函数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ajax 缓存 问题 requestheader
Aug 01 Javascript
分享14个很酷的jQuery导航菜单插件
Apr 25 Javascript
javascript间隔刷新的简单实例
Nov 14 Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 Javascript
JS和JQ的event对象区别分析
Nov 24 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
jQuery读取XML文件内容的方法
Mar 09 Javascript
JavaScript类型系统之Object详解
Jan 07 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
基于JavaScript实现自定义滚动条
Jan 25 Javascript
Angularjs的键盘事件的绑定
Jul 27 Javascript
Vue开发环境跨域访问问题
Jan 22 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
Aug 23 #Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
Aug 23 #Javascript
微信小程序swiper禁止用户手动滑动代码实例
Aug 23 #Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
Aug 23 #Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
Aug 23 #Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
Aug 23 #Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
Aug 23 #Javascript
You might like
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
JavaScript 数组循环引起的思考
2010/01/01 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
JavaScript this使用方法图解
2020/02/04 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
电大会计学自我鉴定
2014/02/06 职场文书
小班评语大全
2014/05/04 职场文书
团队拓展活动总结
2014/08/27 职场文书
私人委托书格式
2014/09/10 职场文书
年终工作总结范文2014
2014/11/27 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
win10更新失败无限重启解决方法
2022/04/19 数码科技