在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 属性在类型检查中的应用 在 JavaScript 中,constructor 属性是一种非常有用的工具,可以帮助我们检查变量的类型。Constructor 属性可以帮助我们解决 typeof 函数无法解决的问题,即无法...
首先,constructor属性存在于所有的JavaScript对象之中,它指向创建当前对象的构造函数。通过这个属性,我们可以获得对象的创建来源,同时也可以用来判断对象的类型。例如,我们创建了一个新对象后,可以通过...
// prototype对象有一个constructor属性,指向BB这个函数。 console.log(b.constructor === BB.prototype.constructor); // true ``` 这段代码说明了`constructor`属性的基本作用: 1. **原型链上的引用**:`...
对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数,除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object)
总结来说,constructor属性在JavaScript类和继承中起到了桥梁作用,它帮助我们识别对象实例的构造函数。在编程实践中,正确使用constructor属性对于维护对象之间的关系非常重要,尤其是当涉及到修改或覆盖构造函数的...
在JavaScript中,我们可以使用内置的`JSON.stringify()`方法将JavaScript对象转换为JSON字符串。 ### JSON.stringify()方法 `JSON.stringify()`是JavaScript中的全局函数,用于将JavaScript值转换为JSON字符串。它...
真正的原因是:一个对象的constructor是它的构造函数的prototype.constructor,而每一个函数都有一个prototype,默认情况下,这个prototype有一个constructor属性,指向的是它自己。 我觉得Javascript的设计本意是让...
### JavaScript内置对象属性及方法详解 #### 一、概述 在JavaScript编程语言中,内置对象是预先定义的对象,用于提供标准的功能集。这些内置对象包括日期处理(`Date`)、数学计算(`Math`)以及数值操作(`Number`...
在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...
constructor 属性是 JavaScript 中的一种特殊属性,它返回对创建此对象的数组函数的引用。下面我们来深入浅析 JavaScript 中的 constructor。 constructor 属性是一个非标准的 JavaScript 属性,但是在大多数...
在JavaScript中,`constructor`属性是一个非常重要的概念,它与对象和类的构造函数紧密相关。构造函数是一种特殊类型的函数,通常用于初始化新创建的对象。当我们谈论`constructor`时,我们指的是一个对象实例的`...
关于 constructor 属性,由于 prototype 对象也是对象,所以它同样具有 constructor 属性。这个属性指向创建该 prototype 对象的函数,即原型对象的构造函数。这个属性常用来在原型链上验证对象的类型,或者用于在...
### JavaScript对象模型详解 #### 一、概述 在JavaScript中,对象模型是其核心特性之一,它决定了数据的存储方式以及程序的运行机制。本文旨在深入解析JavaScript对象模型的关键概念,包括基本数据类型、对象、...
JavaScript的对象是动态的,即可以在运行时添加或删除属性。 #### 三、基础语法 ##### 3.1 变量与对象 在JavaScript中,创建对象可以通过以下方式: ```javascript let person = { name: "John Doe", age: 30 }; ...
JavaScript对象定义是编程语言中的核心概念,它在Web开发中起着至关重要的作用。JavaScript是一种基于原型的对象导向语言,它的对象定义方式具有独特的灵活性。在本文中,我们将深入探讨JavaScript对象的定义、创建...
prototype对象有constructor属性指向BB这个函数;所以alert(b.constructor==BB.prototype.constructor) //true 这里的“有了”的执行过程是先查看b有没有此属性让后去查看prototype里的属性值,不是简单的A=...
### JavaScript对象属性详解 #### Array对象属性与方法 **Array对象**是JavaScript中用来表示数组的数据类型。数组是一种用于存储多个值的变量集合。 - **方法** - **concat()**:连接两个或多个数组,并返回一...
### JavaScript面向对象进阶知识点详解 #### 8.1 面向对象编程的基本特性 在探讨面向对象的JavaScript之前,我们首先需要了解面向对象编程(Object-Oriented Programming, OOP)的基本特性:封装性、抽象性、继承...