`

Javascript中Constructor解剖

阅读更多

constructor的解释:构造函数是一个函数,用来创建和初始化对象。每个构造函数都有一个关联的原型对象,用来实现继承和共享属性。

举例子说明,比如
var A = function (){};
var a = new A();
console.log(a.constructor) // 此时输出的就是A的函数体,即function(){}
从逻辑上来说,实例a的class是A, 它的构造函数是个匿名函数function(){}, 根据输出可能我们还不能判断a.constructor到底是不是指向。于是,重新执行代码:
console.log(a.constructor === A);  //true
这次验证了我们的判断,实例a的constructor就是指向A.
而A.prototype.constructor又是指向谁呢?这个不难判断,因为实例a.constructor默认就是指向A.prototype.constructor,即
console.log(a.constructor === A.prototype.constructor); //true
console.log(A.prototype.constructor === A);//true
通过上面的测试,可以判断轻松判断javascript一些内置对象的construcor比如[1,2,4]它的constructor是Array, true的constructor是Boolean等。
var arr ={1,2,4}
console.log(arr.constructor); //function Array() { [native code] }
console.log(arr.constructor === Array); //true

var bool = true;
console.log(bool.constructor);//function Boolean() { [native code] }
于是也得到了验证。
看到a.constructor的输出结果,可能会有种想法,就是用constructor来判断这个对象的类型,因为在内置对象的constructor.toString()之后,都有字符串反映出这个对象的类型,比如上面的例子,arr.constructor的输出为function Array() { [native code] }, 我们可以截取“Array”, 'Boolean' 部分就可以获取到对象的类型。
constructor
这种情况下是可以的,但是就像第一个里面,如果一些自定义的类,它的实例的constructor的输出的结果是个匿名函数,所以我们没法判断类型。其实也是可以解决的,既然没名字,那就取个名字,比如:
var C = function C(){}
var c = new C();
console.log(c.constructor);//function C(){}
发现拿到了我们想要的东西,但是会不会影响C的功能呢,其实是不会的,可以自己验证下。

到这里貌似用constructor来判断对象类型已经完美了,其实还有一种情况没考虑到,如果prototype变了,constructor还是不是我们想要的呢。
var D = function D(){};
D.prototype = {};
var d = new D();
console.log(d.constructor); //function Object() { [native code] }
发现不是我们期望的function D(){}
这是因为实例的的constructor指向原型的constructor, 而这里的D的原型已经被{}覆盖了,{}的构造器显然是function Object() { [native code] }。

那怎么修复构造器被改的问题呢,可以重新修复下。
var D = function D(){};
D.prototype = {constructor: D}; //修复
var d = new D();
console.log(d.constructor); //function D(){}
这回可以了。。
其实这个判断类型的思路,只是为了介绍constructor,在javascript不需要详细的判断每个自定义Class实例是什么类型,一般情况只需要判断出内置对象的类型比如,Array、Function、RegExp等等,具体方法这里不做介绍。

 

1
0
分享到:
评论

相关推荐

    JavaScript中constructor()方法的使用简介

    从给定文件提供的简单示例中,我们可以看到如何在JavaScript中使用Boolean对象的constructor属性。通过这个例子,我们可以学习到以下几点: 1. 如何创建一个Boolean对象实例: 在JavaScript中,Boolean对象通常...

    JavaScript的constructor属性[文].pdf

    JavaScript constructor 属性在类型检查中的应用 在 JavaScript 中,constructor 属性是一种非常有用的工具,可以帮助我们检查变量的类型。Constructor 属性可以帮助我们解决 typeof 函数无法解决的问题,即无法...

    深化浅析JavaScript中的constructor_.docx

    深化浅析JavaScript中的constructor_ constructor 属性是 JavaScript 中的一种特殊属性,它返回对创建此对象的数组函数的引用。下面我们来深入浅析 JavaScript 中的 constructor。 constructor 属性是一个非标准...

    深入浅析JavaScript中的constructor

    在JavaScript中,`constructor`属性是一个非常重要的概念,它与对象和类的构造函数紧密相关。构造函数是一种特殊类型的函数,通常用于初始化新创建的对象。当我们谈论`constructor`时,我们指的是一个对象实例的`...

    JavaScript中的prototype和constructor简明总结

    在 JavaScript 中,几乎所有的数据类型都有一个 constructor 属性,它指向创建这个数据的构造函数。而 prototype 则是函数所特有的属性,它让函数可以被用作构造器来创建实例,同时这些实例可以共享相同的方法和属性...

    javascript new后的constructor属性.docx

    ### JavaScript中的`new`操作与`constructor`属性详解 #### 一、`new`操作符的理解 在JavaScript中,`new`操作符被用于创建一个由构造函数定义的新实例对象。当使用`new`关键字调用一个构造函数时,会执行以下步骤...

    JavaScript类和继承 constructor属性

    在JavaScript中,constructor属性是一个非常重要的基础概念,它出现在类(Class)和继承(Inheritance)的实现中。constructor属性主要用于识别创建某个对象的构造函数。通常情况下,构造函数的prototype对象会拥有...

    浅谈javascript中的constructor

    在JavaScript中,`constructor`是一个特殊的属性,它存在于每个对象的原型(prototype)上,用于指明该对象是由哪个函数创建的,即哪个构造函数是它的构造器。当我们通过`new`关键字实例化一个对象时,`constructor`...

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

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

    Javascript的构造函数和constructor属性

    JavaScript 构造函数和 constructor 属性是面向对象编程中的重要概念。在 JavaScript 中,构造函数是一种特殊的函数,用于创建和初始化对象。通过使用 new 关键字,我们可以调用一个构造函数来创建一个新对象。每个...

    Javascript中神奇的this

    JavaScript中的`this`关键字是一个非常重要的概念,它与许多其他编程语言中的行为不同,因此常常让开发者感到困惑。本文将详细解析`this`在JavaScript中的工作原理及其绑定规则。 1. `this`并不总是指向函数自身 ...

    理解Javascript_11_constructor实现原理

    在JavaScript中,constructor属性是对象模型的一个重要部分,它用于指出创建对象的构造函数。在理解了对象模型之后,我们可以更深入地探讨constructor属性的实现原理。 首先,constructor属性可以被看作是对象的...

    Javascript中的封装与继承

    在这个文档中,我们将深入探讨JavaScript中的封装和继承这两个核心概念,帮助你更好地理解和应用这些知识。 封装是面向对象编程的基本原则之一,它涉及到如何组织和保护代码,以实现数据隐藏和功能模块化。在...

    java反射之Constructor

    Java 反射机制中的 Constructor 类提供了关于类的单个构造方法的信息,包括对它的访问权限、Class 获取构造函数的方式等。下面将详细讲解 Constructor 类的概述、获取构造函数的方式、构造类的实例概述等。 ...

    prototype,__proto,constructor

    分析javascript中 prototype __proto__ constructor之间的关系

Global site tag (gtag.js) - Google Analytics