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 相关文章推荐
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
轻轻松松学习JavaScript
Feb 25 Javascript
js 解决“options为空或不是对象”
Dec 22 Javascript
JQuery查找DOM节点的方法
Jun 11 Javascript
充分发挥Node.js程序性能的一些方法介绍
Jun 23 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
Aug 24 Javascript
JavaScript 闭包详细介绍
Sep 28 Javascript
详解jQuery中的事件
Dec 14 Javascript
ES6中Math对象的部分扩展
Feb 20 Javascript
使用JS和canvas实现gif动图的停止和播放代码
Sep 01 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
Apr 08 Javascript
layui 弹出层值回传解决方式
Nov 14 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
神族 PROTOSS 概述
2020/03/14 星际争霸
PHP SQLite类
2009/05/07 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
详解PHP序列化反序列化的方法
2015/10/27 PHP
如何正确配置Nginx + PHP
2016/07/15 PHP
Javascript中的delete介绍
2012/09/02 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
vue 实现把路由单独分离出来
2020/08/13 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Python进阶篇之字典操作总结
2016/11/16 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
Python 列表反转显示的四种方法
2020/11/16 Python
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
《黄河颂》教学反思
2014/02/07 职场文书
婚礼主持词
2014/03/13 职场文书
保护动物倡议书
2014/04/15 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
使用MybatisPlus打印sql语句
2022/04/22 SQL Server