理解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 定义新对象方法
Feb 20 Javascript
web基于浏览器的本地存储方法应用
Nov 27 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
Sep 05 Javascript
webpack中引用jquery的简单实现
Jun 08 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
Aug 09 Javascript
一个可复用的vue分页组件
May 15 Javascript
jQuery封装placeholder效果实现方法,让低版本浏览器支持该效果
Jul 08 jQuery
JS+Canvas绘制动态时钟效果
Nov 10 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
Jun 23 Javascript
微信小程序-可移动菜单的实现过程详解
Jun 24 Javascript
详解如何在Javascript和Sass之间共享变量
Nov 13 Javascript
js实现鼠标滑动到某个div禁止滚动
Sep 17 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
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
JS定时器实例
2013/04/17 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
django框架如何集成celery进行开发
2017/05/24 Python
Django组件cookie与session的具体使用
2019/06/05 Python
学党史心得体会
2014/09/05 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
python 爬取吉首大学网站成绩单
2021/06/02 Python
Python函数式编程中itertools模块详解
2021/09/15 Python
JS的深浅复制详细
2021/10/16 Javascript
HTML+JS实现在线朗读器
2022/02/15 Javascript