自己对JS中constructor的误解

比特逐浪
• 阅读 1175

在JS中,构造器(constructor)是用来用new关键词来创建对象的一个普普通通的函数,为了在形式上区别一般的函数,第一个字母通常大写。


function Person(){};  // constructor
var wenzhe = new Person();  

这就是基本的格式,我们能通过wenzhe.constructor或者Person.prototype.constructor来查看我们的构造函数,但是查看的这个构造函数只是表象。它不参与对象的构造,也就是说这个属性只是存储了构造函数的映像而已,没啥用。真正构造对象的那个构造函数永远是new后面那个。即它只是为了方便人查看构造函数而存在的

 function Number() {
    this.name = 'Number';
 }

 function Two() {}

 function Three() {
    this.name = 'Three'
 }

Two.prototype = new Number(); 
Two.prototype.constructor === Number.prototype.constructor; // true
Two.prototype.constructor = Three;
var a = new Two();
a.name // shape;
a.constructor // ..three... 

所以说,当我们 Two.prototype = new Number()之后,最好再添加 Two.prototype.constructor = Two,这样避免混淆。

我们可以用 console.log(wenzhe instanceof Person) 判断对象和构造函数是否对应
,虽然上面那个a.constructor是指向Three,但是console.log(a instanceof Three) 依然为false。

还有一点就是 object literal 或者 Object constructor创建的对象的constructor指向Object

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章带你了解JavaScript作用域
在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域:这个作用域在函数内变化。一、本地JavaScript变量一个变量声明在JavaScript函数内部,成为函数的局部变量。局部变量有局部作用域:它们只能在函数中访问。JS://codeherecann
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
11个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
3A网络 3A网络
2年前
一文了解 Java 中的构造器
一文了解Java中的构造器C引入了构造器(constructor,也叫构造函数)的概念,它是在创建对象时被自动调用的特殊方法。Java也采用了构造器,并且还提供了一个垃圾收集器(garbagecollector),当不再使用内存资源的时候,垃圾收集器会自动将其释放。构造器定义在Java中,可以通过编写构造器来确保每个对象的初始化。但是这
Stella981 Stella981
3年前
Javascript 是如何体现继承的 ?
js继承的概念js里常用的如下两种继承方式:原型链继承(对象间的继承)类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念。所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现在面向对象的语言中,我们使用类来创建一个自定义对象
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Wesley13 Wesley13
3年前
JS原型、原型链深入理解
原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对
Wesley13 Wesley13
3年前
JS中正则表达式
正则表达式的定义js中的正则表达式使用RegExp对象表示,两种创建正则表达式对象的方法直接量定义将表达式包含在斜杠之间varpattern/js/;构造函数定义:使用RegExp()构造函数定义varpatternnewRegExp('js');
Wesley13 Wesley13
3年前
JS基础——原型和原型链
1、相关知识点(1)构造函数 (函数名首字母大写表示构造函数)functionFoo(name,age){this.namename;this.ageage;this.class'class';//returnthis;默认有这一行,浏览器帮忙做
Stella981 Stella981
3年前
Javascript 构造函数和类
1.构造函数构造函数的名称一般都是首字母大写挂载在this上面的属性为实例属性,实例属性再每个实例间都是独立的原型链属性通过prototype添加,他是所有实例共享的类方法/静态属性只能由构造函数本身访问当实例属性和原型链上的属性重名时,优先访问实例属性,没有实例属性再访问原型属性大多数浏览器的ES5实现之中,每一个对象都有\_\_pr
小万哥 小万哥
1年前
C# 面向对象编程进阶:构造函数详解与访问修饰符应用
C构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C服务器创建一个构造函数:csharp//创建一个Car类classCarpublicstringmodel;//创