关于Javascript的对象的constructor属性

 

在Javascript中经常有一些让你匪夷所思的结果,我觉得一个主要的原因是大家最其规范了解甚少.

其实这也无可厚非, JS中有太多的不够优美的地方,且Ecma-262的文档始终没有一份完整的中文版.

今天想说的是Javascript中关于对象的constructor属性,这里需要你了解Javascript的原型链的知识.

关于原型链你可以看我的另一篇文章:Javascript原型链研究

 

在一个对象里访问其属性或者方法,如果对象本身没有就会去其隐式原型(父原型)中访问,这样一层一层的过去直至原型链的根源,即Object对象的显式原型.

 

这里我们先讲一下构造函数,一般在JS中我们定义一个构造函数,函数名都是以大写字母开始,这是一个良好的编程习惯.

每一个构造函数中存在一个显式原型和一个隐式原型,显式原型是你可以改变的,而隐式是你无法访问的.

当你使用new运算符创建一个构造函数的对象的时候,这个对象的隐式原型即为构造函数的显式原型,这样就实现了基于原型的继承.

 

我们自己new出来的对象自己是没有constructor属性的,那么当你访问这个属性的时候,它回去它的原型链中去遍历寻找.

这里举个简单的例子,方便大家理解.

 

 

function Con() 
{
};
var a =  new Con();
alert(a.constructor);

 


这里我们可以看到,结果a的constructor属性为Con,你可能会想a对象就是通过Con构造函数new出来的这很正常.那我们看下面的例子.

 

 

 

 

var obj = {}
function Con() 
{
};
Con.prototype = obj;
var a =  new Con();
alert(a.constructor);

  

 

这次的结果和上次完全不同了,而代码的差别就是我替换了Con的显式原型.

 

 

 

 

从这里我们可以断定,a的constructor和其隐式原型相关,在之前的Javascript原型链研究中我抛出了一个关于原型且和constructor相关的疑问,一直没有得到澄清,最近在看Javascript : The Good Parts中似乎看到了结论.

这本书在第五章 继承 的Pseudoclassical 中如是说

 

/*When a function object is created ,

the Function constructor that produces 

the function object runs some code like this:*/

this.prototype ={constructor:this}

突然之间有种恍然大悟的感觉,原来之前我猜测的是正确的,当然这个描述我没有在ecma-262中找到依据,但是Douglas Crockford的话,我信了.

 

我们回过头来思考一下,每一个通过构造函数的new出来的对象的constructor(也就是说每一个构造函数的显式原型的constructor属性)默认为这个构造函数本身,这样你在思考一下,一切明了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScriptprototypeconstructorJavaScript中的两个概念,用于实现对象的继承和构造。 prototype(原型)是JavaScript中每个对象都有的一个属性,它指向该对象的原型(即父对象)。每个函数都有一个prototype属性,它是一个指向该函数的原型对象的指针。通过修改prototype,可以给该函数的实例对象添加新的属性和方法。这样,函数的实例对象就可以共享这些属性和方法,从而实现了对象的继承。 constructor(构造函数)是一个指向创建该对象的函数的指针。每个对象都有一个constructor属性,它指向该对象的构造函数。通过Constructor属性,我们可以追踪一个对象是由哪个构造函数创建的,以便在需要时通过构造函数进行实例化。 通过prototypeconstructor的结合使用,可以在JavaScript中实现对象的继承和构造。具体的步骤如下: 1. 创建一个构造函数,并定义其原型对象中的属性和方法。 2. 使用new关键字实例化一个对象。 3. 通过对象constructor属性,可以确定对象是由哪个构造函数创建的。 4. 进一步修改构造函数的原型对象,可以为所有实例对象添加新的属性和方法。 JavaScript中的原型继承和构造函数是基于原型链的概念。通过在对象之间共享属性和方法,可以实现更高效的内存使用和代码复用。prototypeconstructor提供了一种灵活而强大的方式来创建和继承对象,它们是JavaScript中非常重要的概念。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值