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 相关文章推荐
基于jQuery捕获超链接事件进行局部刷新代码
May 10 Javascript
js实例属性和原型属性示例详解
Nov 23 Javascript
javascript使用正则表达式检测IP地址
Dec 03 Javascript
详解JS中Array对象扩展与String对象扩展
Jan 07 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
Jun 13 Javascript
js实现背景图自适应窗口大小
Jan 10 Javascript
将angular-ui的分页组件封装成指令的方法详解
May 10 Javascript
iframe与主框架跨域相互访问实现方法
Sep 14 Javascript
ng-repeat指令在迭代对象时的去重方法
Oct 02 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
Mar 25 Javascript
Openlayers实现地图全屏显示
Sep 28 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
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python检测生僻字的实现方法
2016/10/23 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
Django 返回json数据的实现示例
2020/03/05 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
python求解汉诺塔游戏
2020/07/09 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
应届毕业生个人自我评价
2013/09/20 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
征兵宣传标语
2014/06/20 职场文书
颐和园导游词400字
2015/01/30 职场文书
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技