理解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 相关文章推荐
基于JQuery的简单实现折叠菜单代码
Sep 15 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
Jan 21 Javascript
js window对象属性和方法相关资料整理
Nov 11 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
Jun 12 jQuery
vue better-scroll插件使用详解
Jan 25 Javascript
JS使用对象的defineProperty进行变量监控操作示例
Feb 02 Javascript
javascript实现5秒倒计时并跳转功能
Jun 20 Javascript
手把手15分钟搭一个企业级脚手架
Sep 16 Javascript
关于layui导航栏不展示下拉列表的解决方法
Sep 25 Javascript
Vue强制组件重新渲染的方法讨论
Feb 03 Javascript
详解如何在Javascript中使用Object.freeze()
Oct 18 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 注释规范
2012/03/29 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
python中ConfigParse模块的用法
2014/09/29 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
详解python的四种内置数据结构
2019/03/19 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
销售人员自我评价
2014/02/01 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
中等生评语大全
2014/05/04 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
植物园观后感
2015/06/11 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
二年级作文之动物作文
2019/11/13 职场文书