`
lukejin
  • 浏览: 362210 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于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属性)默认为这个构造函数本身,这样你在思考一下,一切明了.

  • 大小: 11 KB
  • 大小: 9.7 KB
分享到:
评论

相关推荐

    JavaScript精炼之构造函数 Constructor及Constructor属性详解

    对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数,除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object)

    Javascript的构造函数和constructor属性

    真正的原因是:一个对象的constructor是它的构造函数的prototype.constructor,而每一个函数都有一个prototype,默认情况下,这个prototype有一个constructor属性,指向的是它自己。 我觉得Javascript的设计本意是让...

    JavaScript类和继承 constructor属性

    constructor属性始终指向创建当前对象的构造函数。比如下面例子:比如下面例子: 代码如下: // 等价于 var foo = new Array(1, 56, 34, 12); var arr = [1, 56, 34, 12]; console.log(arr.constructor === Array); /...

    javascript new后的constructor属性

    prototype对象有constructor属性指向BB这个函数;所以alert(b.constructor==BB.prototype.constructor) //true 这里的“有了”的执行过程是先查看b有没有此属性让后去查看prototype里的属性值,不是简单的A=...

    深入浅析JavaScript中的constructor

    constructor 属性返回对创建此对象的数组函数的引用。本文给大家介绍JavaScript中的constructor ,需要的朋友参考下吧

    Javascript中获取对象的原型对象的方法小结

    在Javascript中,如果我们有一个对象但是又不知道它的构造函数时,如何获取它的原型对象呢? 在Chrome中或是FireFox浏览器中,我们可以直接使用对象的__proto__属性获取它的原型对象。 代码如下: <!– lang: js ...

    举例说明JavaScript中的实例对象与原型对象

    首先声明:javascript中每个对象都有一个constructor属性和一个prototype属性。constructor指向对象的构造函数,prototype指向使用构造函数创建的对象实例的原型对象。 function Person(){ } var person = new ...

    【JavaScript源代码】JavaScript中的几种继承方法示例.docx

    JavaScript中的几种继承方法示例  1.原型链继承 ...原型对象上有一个constructor属性,指向创建该对象的构造函数,该属性不可枚举。 var obj = {}; obj.__proto__ === Object.prototype; //true console

    JavaScript中继承的一些示例方法与属性参考

    prototype 属性的功能: 所有JavaScript 内部对象都有只读的prototype 属性。可以为内部对象的原型添加功能,但该对象不能被赋予不同的原型。 然而,用户定义的对象可以被赋给新的原型。 constructor 属性的作用: ...

    JavaScript中判断对象类型的几种方法总结

    我们知道,JavaScript中检测对象类型的运算符有:typeof、instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串。如:”number”,”string”,”...

    详解JavaScript对象的深浅复制

    在复制对象时,除了要复制对象的属性外,还要兼顾到是否保留了对象的constructor属性,是否对每一种数据类型(JavaScript常见的数据类型有String,Number,Boolean,Data,RegExp,Array,Funtion,Object)都实现正确的...

    浅谈javascript中的constructor

    constructor,构造函数,对这个名字,我们都不陌生,constructor始终指向创建当前对象的构造函数。 这里有一点需要注意的是,每个函数都有一个prototype属性,这个prototype的constructor指向这个函数,这个时候我们...

    详解JavaScript中的构造器Constructor模式

    构造器模式简单描述(看图): 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载...Javascript不支持类的情况下对象与Constructor,通过new关键字实例化一个对象,代码大概是这样的 funct

    javascript学习笔记.docx

    f) 继承:只是在查询一个属性时自动发生,而不会在写属性时发生,就是说单写一个父类的属性时,JavaScript环境会为对象本身创建一个同名的属性,从此该属性就覆盖了父类中的属性。 12) 创建一个数组可用 new Array()...

    JavaScript中几个重要的属性(this、constructor、prototype)介绍

    this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window,prototype本质上还是一个JavaScript对象,constructor始终指向创建当前对象的构造函数

    JavaScript中Boolean对象的属性解析

    主要介绍了JavaScript中布尔对象的属性解析,包括对constructor属性和prototype构造器的简单介绍,需要的朋友可以参考下

    javascript设计模式Constructor(构造器)模式

    Constructor是一种在内存已分配给该对象的情况下,用于初始化新创建对象的特殊方法。Object构造器用于创建特定类型的对象–准备好对象以备使用,同事接收构造器可以使用参数,以在第一次创建对象时,设置成员属性和...

Global site tag (gtag.js) - Google Analytics