javascript 中__proto__和prototype详解


Posted in Javascript onNovember 25, 2014

__proto__是内部原型,prototype是构造器原型(构造器其实就是函数)

构造器的原型(prototype)是一个对象

那什么是构造器呢?
要想创建一个对象,首先要有一个对象构造器,就像php里面一样,要想创建一个对象,首先要有一个类
构造器的实质就是一个函数,下面的问题是:如何通过这个构造器来创建一个对象呢?
答案: new

构造器构造的是对象。
一、所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function)

Number.__proto__ === Function.prototype  

// true

Boolean.__proto__ === Function.prototype 

// true

String.__proto__ === Function.prototype  

// true

Object.__proto__ === Function.prototype  

// true

Function.__proto__ === Function.prototype 

// true

Array.__proto__ ===

Function.prototype   

// true

RegExp.__proto__ === Function.prototype  

// true

Error.__proto__ ===

Function.prototype   

// true

Date.__proto__ ===

Function.prototype    

// true

说明了Number等都是构造器,这些构造器其实是Function的一个对象。 也就是说相当于 var Number = new Function();

JavaScript中有内置(build-in)构造器/对象共计12个(ES5中新加了JSON),这里列举了可访问的8个构造器。剩下如Global不能直接访问,Arguments仅在函数调用时由JS引擎创建,Math,JSON是以对象形式存在的,无需new。它们的__proto__是Object.prototype。如下

Math.__proto__ === Object.prototype  

// true

JSON.__proto__ === Object.prototype  

// true

上面说的“所有构造器/函数”当然包括自定义的。如下

// 函数声明

function Person()

{}

// 函数表达式

var Man

= 

function()

{}

console.log(Person.__proto__ === Function.prototype) 

// true

console.log(Man.__proto__ ===

Function.prototype)    

// true

这说明什么呢?

所有的构造器都来自于Function.prototype,甚至包括根构造器Object及Function自身。所有构造器都继承了Function.prototype的属性及方法。如length、call、apply、bind(ES5)。

Function.prototype也是唯一一个typeof XXX.prototype为 “function”的prototype。其它的构造器的prototype都是一个对象。如下

console.log(typeof Function.prototype) 

// function

console.log(typeof Object.prototype)   

// object

console.log(typeof Number.prototype)   

// object

console.log(typeof Boolean.prototype)  

// object

console.log(typeof String.prototype)   

// object

console.log(typeof Array.prototype)    

// object

console.log(typeof RegExp.prototype)   

// object

console.log(typeof Error.prototype)    

// object

console.log(typeof Date.prototype)     

// object

console.log(typeof Object.prototype)   

// object

噢,上面还提到它是一个空的函数,alert(Function.prototype) 下看看。

知道了所有构造器(含内置及自定义)的__proto__都是Function.prototype,那Function.prototype的__proto__是谁呢?

相信都听说过JavaScript中函数也是一等公民,那从哪能体现呢?如下

console.log(Function.prototype.__proto__ ===

Object.prototype) 

// true

这说明所有的构造器也都是一个普通JS对象,可以给构造器添加/删除属性等。同时它也继承了Object.prototype上的所有方法:toString、valueOf、hasOwnProperty等。

最后Object.prototype的__proto__是谁?

Object.prototype.__proto__ === 

null  //

true

已经到顶了,为null。

大家是否对javascript 中__proto__和prototype之间的区别联系有所了解了呢,有疑问就留言,大家共同探讨吧

Javascript 相关文章推荐
Javascript中的常见排序算法
Mar 27 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
UI Events 用户界面事件
Jun 27 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
Aug 22 Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 Javascript
H5用户注册表单页 注册模态框!
Sep 17 Javascript
javascript计算对象长度的方法
Oct 25 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
Sep 20 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
Sep 26 Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 Javascript
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
详解JavaScript中Arguments对象用途
Aug 30 Javascript
js 加密压缩出现bug解决方案
Nov 25 #Javascript
js Object2String方便查看js对象内容
Nov 24 #Javascript
js的[defer]和[async]属性
Nov 24 #Javascript
使用JavaScript 编写简单计算器
Nov 24 #Javascript
JS和JQ的event对象区别分析
Nov 24 #Javascript
JavaScript实现大数的运算
Nov 24 #Javascript
使表格的标题列可左右拉伸jquery插件封装
Nov 24 #Javascript
You might like
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
Python Series从0开始索引的方法
2018/11/06 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
Django实现内容缓存实例方法
2020/06/30 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
大学生毕业自我评价范文分享
2013/11/11 职场文书
大学班级计划书
2014/04/29 职场文书
物流管理专业求职信
2014/05/29 职场文书
宣传普通话标语
2014/06/27 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
2015入党自传书范文
2015/06/26 职场文书
入党申请书怎么写?
2019/06/21 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
基于Python实现对比Exce的工具
2022/04/07 Python
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL