JS原型prototype和__proto__用法实例分析


Posted in Javascript onMarch 14, 2020

本文实例讲述了JS原型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__结果如下:

JS原型prototype和__proto__用法实例分析

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

Foo.prototype结果如下:

JS原型prototype和__proto__用法实例分析

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

实例说明了:

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

Foo是Function的一个实例,而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属性。

摘录网上

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

JS原型prototype和__proto__用法实例分析

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

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery chili图片远处放大插件
Nov 30 Javascript
删除条目时弹出的确认对话框
Jun 05 Javascript
jQuery文件上传插件Uploadify使用指南
Jun 05 Javascript
JavaScript从数组中删除指定值元素的方法
Mar 18 Javascript
js+canvas简单绘制圆圈的方法
Jan 28 Javascript
JavaScript学习笔记之函数记忆
Sep 06 Javascript
AngularJS 教程及实例代码
Oct 23 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
Oct 26 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
Feb 10 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 Javascript
解决vue项目 build之后资源文件找不到的问题
Sep 12 Javascript
微信小程序入门之绘制时钟
Oct 22 Javascript
JS数组的高级使用方法示例小结
Mar 14 #Javascript
vue-resource post数据时碰到Django csrf问题的解决
Mar 13 #Javascript
js函数和this用法实例分析
Mar 13 #Javascript
js对象简介与基本用法示例
Mar 13 #Javascript
JS自定义滚动条效果
Mar 13 #Javascript
js Math数学简单使用操作示例
Mar 13 #Javascript
Vue实现仿iPhone悬浮球的示例代码
Mar 13 #Javascript
You might like
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
原生Js实现简易烟花爆炸效果的方法
2015/03/20 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
浅入深出Vue之自动化路由
2019/08/06 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
详解python之简单主机批量管理工具
2017/01/27 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
Python 变量类型详解
2018/10/10 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
DataList 能否分页,请问如何实现?
2015/05/03 面试题
料理师求职信
2014/01/30 职场文书
学生请假条
2014/04/11 职场文书
温馨提示标语
2014/06/26 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
中层干部考核评语
2015/01/04 职场文书
承诺书范本
2015/01/21 职场文书
工会工作个人总结
2015/03/03 职场文书
大学毕业论文致谢词
2015/05/14 职场文书
JS封装cavans多种滤镜组件
2022/02/15 Javascript