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 相关文章推荐
ExtJS 2.0实用简明教程 之ExtJS版的Hello
Apr 29 Javascript
jquery animate 动画效果使用说明
Nov 04 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
Mar 29 Javascript
一个简单的Node.js异步操作管理器分享
Apr 29 Javascript
JS实现的5级联动Select下拉选择框实例
Aug 17 Javascript
浅析JavaScript 调试方法和技巧
Oct 22 Javascript
js滚轮事件兼容性问题需要注意哪些
Nov 15 Javascript
vue中计算属性(computed)、methods和watched之间的区别
Jul 27 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
Jul 26 Javascript
浅谈redux以及react-redux简单实现
Aug 28 Javascript
详解vue-cli3多页应用改造
Jun 04 Javascript
如何进行微信公众号开发的本地调试的方法
Jun 16 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
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
jquery JSON的解析方式
2009/07/25 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
vscode自定义vue模板的实现
2021/01/27 Vue.js
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
Python中用于计算对数的log()方法
2015/05/15 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
python中for in的用法详解
2020/04/17 Python
实例代码讲解Python 线程池
2020/08/24 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
C++面试题目
2013/06/25 面试题
房屋租赁合同协议书范本
2014/10/19 职场文书
高三英语教学反思
2016/03/03 职场文书
解析MySQL binlog
2021/06/11 MySQL
Python Pandas 删除列操作
2022/03/16 Python
基于docker安装zabbix的详细教程
2022/06/05 Servers