理解Javascript_11_constructor实现原理

 更新时间:2010年10月18日 00:46:50   作者:  
在理解了'对象模型'后,我们就可以看一下constructor属性是如何实现的.
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”的属性,它反过来引用函数本身。这是一种循环引用,如图:

constructor属性来自何方
我们来看一下Function构造String的构造过程:

注: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是如何处理的:

你会发现,这图的原理和上面一张图的原理是一样的。这就能正确解释Object.prototype.hasOwnProperty('isPrototypeOf')为true!

constructor探究
复制代码 代码如下:

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

根据上一节的内容,你能正确的理解这段代码的结果吗?思考后,看一下其内存表示:

这张图明确有表明了Function构造Animal和Person的过程。同时也显示了实例person与Person的关系。

再深入一点,代码如下:
复制代码 代码如下:

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

这个时候,person的构造函数成了Animal,怎么解释?

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

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

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

相关文章

  • Javascript动态创建表格及删除行列的方法

    Javascript动态创建表格及删除行列的方法

    这篇文章主要介绍了Javascript动态创建表格及删除行列的方法,涉及javascript动态操作表格的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Maps Javascript

    Maps Javascript

    Maps Javascript...
    2007-01-01
  • js仿百度贴吧验证码特效实例代码

    js仿百度贴吧验证码特效实例代码

    这篇文章主要介绍了js仿百度贴吧验证码特效实例代码,有需要的朋友可以参考一下
    2014-01-01
  • JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能

    JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能

    这篇文章主要介绍了JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能.结合实例形式分析了javascript基于单例模式结合ajax针对数据库进行增删改查的相关操作技巧,需要的朋友可以参考下
    2018-02-02
  • Javascript实现基本运算器

    Javascript实现基本运算器

    这篇文章主要为大家详细介绍了Javascript实现基本运算器的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • typescript中正则表达式的常用使用方法

    typescript中正则表达式的常用使用方法

    这篇文章主要给大家介绍了关于typescript中正则表达式的常用使用方法,TypeScript是一种静态类型的JavaScript超集,它提供了对正则表达式的全面支持,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • bootstrap select下拉搜索插件使用方法详解

    bootstrap select下拉搜索插件使用方法详解

    这篇文章主要为大家详细介绍了bootstrap select下拉搜索插件的使用方法,动态加载自己数据的二级联动,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • input 宽度自适应

    input 宽度自适应

    感谢网友“liufabin”提出的关于不支持FF的问题,第一个在FF下经过测试时支持的,第二个中的高度自适应不支持,我在网上找了一个JQUERY的插件
    2009-05-05
  • JavaScript数组去重算法实例小结

    JavaScript数组去重算法实例小结

    这篇文章主要介绍了JavaScript数组去重算法,结合实例形式总结分析了JavaScript数组去重相关的读写、遍历、比较、排序等操作及算法改进相关实现技巧,需要的朋友可以参考下
    2018-05-05
  • 基于JavaScript实现添加到购物车效果附源码下载

    基于JavaScript实现添加到购物车效果附源码下载

    这篇文章主要介绍了基于JavaScript实现添加到购物车效果附源码下载的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08

最新评论