理解Javascript_11_constructor实现原理


Posted in Javascript onOctober 18, 2010

constructor是什么

简单的理解,constructor指的就是对象的构造函数。请看如下示例:

function Foo(){}; 
var foo = new Foo(); 
alert(foo.constructor);//Foo 
alert(Foo.constructor);//Function 
alert(Object.constructor);//Function 
alert(Function.constructor);//Function

对于foo.constructor为Foo,我想应该很好理解,因为foo的构造函数为Foo。对于Foo、Object、Function的构造函数为Function,我想也没什么好争议的。(因为Foo,Object,Function都是函数对象,又因为所有的函数对象都是Function这个函数对象构造出来,所以它们的constructor为Function,详细请参考《js_函数对象》)

Prototype与Constructor的关系

function Dog(){} 
alert(Dog === Dog.prototype.constructor);//true

在 JavaScript 中,每个函数都有名为“prototype”的属性,用于引用原型对象。此原型对象又有名为“constructor”的属性,它反过来引用函数本身。这是一种循环引用,如图:
理解Javascript_11_constructor实现原理
constructor属性来自何方
我们来看一下Function构造String的构造过程:
理解Javascript_11_constructor实现原理
注:Function构造任何函数对象的过程都是一样的,所以说不管是String,Boolean,Number等内置对象,还是用户自定义对象,其构造过程都和上图一样。这里String只是一个代表而矣!
图中可以看出constructor是Function在创建函数对象时产生的,也正如'prototype与constructor的关系'中讲的那样,constructor是函数对象prototype链中的一个属性。即String=== String.prototype.constructor。

我还想用一段代码来证明一下,理论是正确的:

function Person(){} 
var p = new Person(); 
alert(p.constructor);//Person 
alert(Person.prototype.constructor);//Person 
alert(Person.prototype.hasOwnProperty('constructor'));//true 
alert(Person.prototype.isPrototypeOf(p));//true 
alert(Object.prototype.isPrototypeOf(p));//true 
alert(Person.prototype == Object.prototype);//false

到现在,你会发现这和前面《原型链的实现原理》中的默认prototype指向Object.prototype有冲突,显然当时的理论不是很全面。

特别的Object
用心的读者可能会提出这样一问题,你这一套理论并不能适用于Object。因为以下的代码和你上面的理论是冲突的:

alert(Object.prototype.hasOwnProperty('constructor'));//true 
alert(Object.prototype.hasOwnProperty('isPrototypeOf'));//true,如果按上面的理论,这里应该返回false

真的是这样吗?不是!那我们来看一下特殊的Object是如何处理的:
理解Javascript_11_constructor实现原理
你会发现,这图的原理和上面一张图的原理是一样的。这就能正确解释Object.prototype.hasOwnProperty('isPrototypeOf')为true!

constructor探究

function Animal(){} 
function Person(){} 
var person = new Person(); 
alert(person.constructor); //Person

根据上一节的内容,你能正确的理解这段代码的结果吗?思考后,看一下其内存表示:
理解Javascript_11_constructor实现原理
这张图明确有表明了Function构造Animal和Person的过程。同时也显示了实例person与Person的关系。

再深入一点,代码如下:

function Animal(){} 
function Person(){} 
Person.prototype = new Animal(); 
var person = new Person(); 
alert(person.constructor); //Animal

这个时候,person的构造函数成了Animal,怎么解释?
理解Javascript_11_constructor实现原理
注:图中的虚线表示Person默认的prototype指向(只作参考的作用)。但是我们将Person.prototype指向了new Animal。
此时,Person的prototype指向的是Animal的实例,所以person的constructor为Animal这个构造函数。

结论:constructor的原理非常简单,就是在对象的原型链上寻找constructor属性。

注:如果你无法正确理解本文内容,请回顾前面章节的内容。

Javascript 相关文章推荐
javascript之函数直接量(function(){})()
Jun 29 Javascript
使用angular写一个hello world
Jan 23 Javascript
JavaScript使用cookie实现记住账号密码功能
Apr 27 Javascript
canvas绘制的直线动画
Jan 23 Javascript
JavaScript操作文件_动力节点Java学院整理
Jun 30 Javascript
vue中keep-alive的用法及问题描述
May 15 Javascript
深入理解react-router 路由的实现原理
Sep 26 Javascript
Vue 幸运大转盘实现思路详解
May 06 Javascript
Vue 2.0双向绑定原理的实现方法
Oct 23 Javascript
js canvas实现星空连线背景特效
Nov 01 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
Apr 22 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
Oct 18 #Javascript
jQuery Validation实例代码 让验证变得如此容易
Oct 18 #Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
Oct 17 #Javascript
基本jquery的控制tabs打开的数量的代码
Oct 17 #Javascript
Javascript表达式中连续的 && 和 || 之赋值区别
Oct 17 #Javascript
Javascript读取cookie函数代码
Oct 16 #Javascript
JavaScript 拾碎[三] 使用className属性
Oct 16 #Javascript
You might like
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
python实现划词翻译
2020/04/23 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
python实现可下载音乐的音乐播放器
2020/02/25 Python
Puma印度官网:德国运动品牌
2019/10/06 全球购物
物业经理求职自我评价
2013/09/22 职场文书
大学生党课思想汇报
2013/12/29 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
质量保证书格式模板
2015/02/27 职场文书
2015年教研工作总结
2015/05/23 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
客户答谢会致辞
2015/07/30 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server