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 相关文章推荐
javascript开发技术大全-第1章javascript概述
Jul 03 Javascript
js中精确计算加法和减法示例
Mar 28 Javascript
javascript实现动态模态绑定grid过程代码
Sep 22 Javascript
JS实现双击编辑可修改状态的方法
Aug 14 Javascript
Node.js中使用jQuery的做法
Aug 17 Javascript
JavaScript实现经典排序算法之插入排序
Dec 28 Javascript
微信小程序 二维码canvas绘制实例详解
Jan 06 Javascript
原生JS实现简单放大镜效果
Feb 08 Javascript
vue数据双向绑定原理解析(get &amp; set)
Mar 08 Javascript
微信小程序获取用户信息并保存登录状态详解
May 10 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
Sep 05 Javascript
js实现数字从零慢慢增加到指定数字示例
Nov 07 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
php循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
Python中的元类编程入门指引
2015/04/15 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
使用Python实现牛顿法求极值
2020/02/10 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
Python环境配置实现pip加速过程解析
2020/11/27 Python
药剂学专业应届生自荐信
2013/09/29 职场文书
个人自我鉴定怎么写
2013/10/28 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
酒店节能减排方案
2014/05/26 职场文书
给病人的慰问信
2015/03/23 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python