首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript在构造函数和作为构造函数调用的函数返回对象之间有什么区别?

在JavaScript中,构造函数和作为构造函数调用的函数之间存在一些重要区别,这些区别与对象的创建和初始化有关。

  1. 构造函数:

构造函数是用于创建对象实例的函数。它们通常包含一些参数,用于设置对象的属性。当使用new关键字创建一个新对象时,JavaScript会自动调用构造函数。

例如,以下是一个简单的构造函数:

代码语言:javascript
复制
function Person(name, age) {
  this.name = name;
  this.age = age;
}

当使用new关键字创建一个新对象时,如下所示:

代码语言:javascript
复制
const person1 = new Person('Alice', 30);

JavaScript将调用Person构造函数,并将'Alice'和30赋值给对象的name和age属性。

  1. 作为构造函数调用的函数:

作为构造函数调用的函数通常用于在创建对象实例时执行一些初始化逻辑。它们可以是静态函数,也可以是在构造函数中调用。

例如,以下是一个作为构造函数调用的函数:

代码语言:javascript
复制
class Animal {
  constructor(name) {
    this.name = name;
    this.habitat = 'unknown';
  }

  initHabitat() {
    this.habitat = 'savannah';
  }
}

在这个例子中,Animal类有一个构造函数,它接受一个name参数,并在初始化时设置对象的name属性。initHabitat函数是一个作为构造函数调用的函数,它设置对象的habitat属性。当使用new关键字创建一个新对象时,JavaScript将调用构造函数,并执行initHabitat函数。

总的来说,构造函数和作为构造函数调用的函数之间的主要区别在于,构造函数是用于创建对象实例的函数,而作为构造函数调用的函数是在创建对象实例时执行一些初始化逻辑的函数。在JavaScript中,使用new关键字创建一个新对象时,会自动调用构造函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript this 小结纯粹函数调用作为对象方法调用作为构造函数调用apply 调用

JavaScript 语言一个关键字。 它是函数运行时,函数体内部自动生成一个对象,只能在函数体内部使用。 ? 上面代码中,函数test运行时,内部会自动一个this对象可以使用。...那么,this值是什么呢? 函数不同使用场合,this不同值。 总的来说,this就是函数运行时所在环境对象。...下面分情况,详细讨论 纯粹函数调用 函数最通常用法,属全局性调用,this即代表全局对象。 ?...运行结果是1 作为对象方法调用 函数还可以作为某个对象方法调用,这时this就指这个上级对象 ? 结果:1 作为构造函数调用 通过这个函数,可以生成一个新对象。this就指这个新对象。 ?...它第一个参数就表示改变后调用这个函数对象。因此,这时this指就是这第一个参数。 ? apply()参数为空时,默认调用全局对象。因此,这时运行结果为0,证明this指的是全局对象

2.6K20

【C++】拷贝构造函数调用时机 ② ( 对象作为函数参数 | 对象作为函数返回值 )

博客总结 : " 拷贝构造函数 " 又称为 " 赋值构造函数 " , 该类型构造函数 4 种调用时机 ; ① 使用一个对象初始化另外一个对象 : 使用 一个 类实例对象 初始化 另外一个 类实例对象...指针 或 引用 方式 ; // 定义函数, 接收 Student 对象作为参数 void fun(Student s) { } ④ 对象作为函数返回值 : 函数直接返回实例对象 值 , 不是返回..., 使其内容与原对象完全相同 ; 二、对象作为函数参数 ---- 1、拷贝构造函数调用情况说明 类实例对象 以值方式 传递给函数 , 不是以 指针 或 引用 方式 ; 这种情况 是 以 类...三、对象作为函数返回值 ---- 1、拷贝构造函数调用情况说明 函数直接返回实例对象 值 , 不是返回 指针 或 引用 ; 下面的代码 , 定义了函数 , 返回函数内部创建 Student 类实例对象..., 栈内存中 Student 对象也会被销毁 , 因此 Student 类型返回值需要返回一个副本 , 这个副本需要调用 拷贝构造函数 创建 ; 2、代码示例 - 对象作为函数返回值 代码示例

18520

java构造代码块,构造函数普通函数区别调用时间

在这里我们谈论一下构造代码块,构造函数普通函数区别调用时间。 构造代码块:最早运行,比构造函数运行时间好要提前,构造函数一样,只在对象初始化时候运行。...构造函数:运行时间比构造代码块时间晚,也是在对象初始化时候运行。没有返回值,构造函数名称类名一致。...普通函数:不能自动调用,需要对象调用,例如a.add(); 如果只看代码运行先后顺序的话:构造代码块>构造函数>普通函数 下面给一个程序 1 public class Test1 { 2 3...} 30 } 运行结果: image.png 通过上面的程序运行结果,我们可以看出,不管构造代码块是构造函数之后还是构造函数之前,都是先运行构造代码块 然后在运行构造函数。...构造函数通过重载,两种初始化方式,一种是没有参数,一种是参数。 如果不调用普通函数,普通函数是不能执行

1.5K20

秒懂JS对象构造函数原型对象之间关系

一、基本概念   1、对象:属性方法集合,即变量函数封装。每个对象都有一个__proto__属性,指向这个对象构造函数原型对象。   ...3、原型对象:每个函数都有一个prototype属性,它是一个指向原型对象指针(原型对象定义函数时同时被创建) 二、创建对象方法   1、使用构造函数原型对象共同创建 ?...通过构造函数创建实例对象p1p2时候,其中name、age、job这些是通过构造函数生成(本地部分),sayName方法是通过继承原型对象来实现共享(远程部分),这样多个实例对象都是由本地(私有...妈让每个孩子拥有私有能力,爸让它们拥有共有能力(这个共有能力其实都是爸代劳/(ㄒoㄒ)/~~);没有构造函数情况下,可以直接理解为克隆哦~怎么样,这样应该能理解三者之间关系了吧。...当然创建对象方法远不止这两种,这里九种创建对象方法,oh no?我只想要个对象,为什么这么复杂?为了优化代码,这个理由足够吧。

1.7K70

【C++】构造函数分类 ③ ( 调用构造函数方法 | 括号法 | 等号法 )

一、不同内存中创建类实例对象 在上一篇博客 【C++】构造函数分类 ② ( 不同内存中创建类实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 ) 中 , 分析了 栈内存 ...* m_name; 之后都是以该成员变量为参考 , 为这两个成员变量赋值 ; 1、括号法调用构造函数 首先 , Student 类中, 定义两个构造函数 , 之后就使用括号法调用上述构造函数...s2 变量 ; 匿名对象创建完成后 , 会立刻进行初始化 ; // 手动调用构造函数 // 直接调用构造函数会产生匿名对象, 涉及到该匿名对象生命周期 Student s2 = Student...(18, "Tom"); 推荐用法 : 栈内存中创建 类 实例对象 , 推荐使用 下面的方法 , 声明 栈内存变量名称后 , 直接使用括号 , 并传入构造函数参数 ; // 使用 括号法...构造函数 , 并将创建 实例对象 赋值给 s5 变量 , 这是 C++ 对 = 等号运算符增强 ; // 使用 等号法 调用 一个参数 构造函数 // C++ 对等号进行了功能增强

19540

Javascript面向对象编程(二):构造函数继承

这个系列第一部分,主要介绍了如何"封装"数据方法,以及如何从原型对象生成实例。 今天要介绍是,对象之间"继承"五种方法。 比如,现在有一个"动物"对象构造函数。   ...一、 构造函数绑定 第一种方法也是最简单方法,使用call或apply方法,将父对象构造函数绑定在子对象上,即在子对象构造函数中加一行:   function Cat(name,color){...所以,上面这一段代码其实是问题。...alert(Animal.prototype.constructor); // Cat 四、 利用空对象作为中介 由于"直接继承prototype"存在上述缺点,所以就有第四种方法,利用一个空对象作为中介...这等于对象上打开一条通道,可以直接调用对象方法。这一行放在这里,只是为了实现继承完备性,纯属备用性质。 五、 拷贝继承 上面是采用prototype对象,实现继承。

1.2K80

Javascript 原型链之原型对象、实例构造函数三者之间关系

,也就是说将函数用作构造函数调用(使用new操作符调用时候,新创建对象会从原型对象上继承属性方法。...再来说一下constructor,对象constructor属性用于返回创建该对象函数,也就是我们常说构造函数。...当我们将该函数作为模版创建实例(new方法)时候,我们发现创建出实例是一个与构造函数同名object,这个object是独立,他只包含了一个__proto__指针(实例没有prototype,强行访问则会输出...之所以加上引号,因为构造函数实例之间无法直接访问,需要通过__proto__指针间接读取。 function ab(){} var c = new ab(); console.log(c....javascript当中除了undefinednull外都有__proto__,但是只有function对象才有prototype属性,其他任何类型值都没有。

62010

Javascript面向对象编程(三):非构造函数继承

这个系列第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承"。 今天是最后一个部分,介绍不使用构造函数实现"继承"。 一、什么是"非构造函数"继承?...这里要注意,这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。...);   Doctor.career = '医生';   alert(Doctor.nation); // 中国 但是,这样拷贝一个问题。...这是早期jQuery实现继承方式。 四、深拷贝 所谓"深拷贝",就是能够实现真正意义上数组对象拷贝。它实现并不难,只要递归调用"浅拷贝"就行了。   ...然后,对象上修改这个属性:   Chinese.birthPlaces = ['北京','上海','中国香港'];   Doctor.birthPlaces.push('厦门');

1.2K50

【C++】构造函数初始化列表 ① ( 类对象作为成员变量时构造函数问题 | 构造函数初始化列表语法规则 )

一、类对象作为成员变量时构造函数问题 1、问题描述 如果 一个类 A 对象 作为 另外一个类 B 成员变量时 , 以下场景会报错 : 为类 A 定义 构造函数 , 那么 A 无参默认构造函数就失效了...; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 一个类中 , 其成员变量是 带有参构造函数 类型 , 这种情况下没有调用 构造函数机会 , 此时就会出现 编译报错情况 ; 在下面的代码中... 无参构造函数创建 A 对象 , 但是 A 无参构造函数无法使用 , 必须使用 A 构造函数 , 这里就出现问题 , 报错 “B::B(void)”: 由于 数据成员“B::m_a”不具备相应...(成员变量值) , 成员变量名称(成员变量值) { // 构造函数内容 } 构造函数初始化列表 位置 构造函数 参数列表之后 , 冒号 : 与花括号 {} 之间 ; 使用 逗号 , 分隔 ;...初始化列表中元素由 成员变量名称 初始值组成 , 使用等号 = 连接 ; 在下面的代码中 , 为 B 类定义了默认构造函数 , 其中定义了 构造函数 初始化列表 ; 初始化列表中 , m_age

51930

【C++】匿名对象 ③ ( 函数返回值为对象值时 匿名对象 拷贝构造函数 与 析构函数 调用情况分析 )

将一个对象赋值给另外一个对象 ) 【C++】拷贝构造函数调用时机 ② ( 对象作为函数参数 | 对象作为函数返回值 ) 博客中 , 分析了 拷贝构造函数 调用时机 ; " 拷贝构造函数 " 又称为...对象作为参数 void fun(Student s) { } ④ 对象作为函数返回值 : 函数直接返回实例对象 值 , 不是返回 指针 或 引用 ; // 定义函数, 返回 Student 对象作为返回值...逐条分析 构造函数 / 拷贝构造函数 / 析构函数 调用过程 : 调用带参数构造函数 m_age = 12 这是 fun 函数中 , 调用 构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是...逐条分析 构造函数 / 拷贝构造函数 / 析构函数 调用过程 : 调用带参数构造函数 m_age = 18 这是 main 函数中 , 调用 构造函数 , 创建 普通对象 ; 调用带参数构造函数...m_age = 12 这是 fun 函数中 , 调用 构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是 fun 函数中 , 函数返回对象值时 , 创建 要返回 普通对象副本 , 也就是一个

26120

JavaScript对象 ③ ( 使用 new Object 创建对象 | 使用 构造函数 创建对象 | 构造函数语法 | 使用 字面量 new Object 创建对象方法弊端 )

new Object 创建对象方法弊端 JavaScript 中 , 使用 字面量 new Object 方式 创建对象 , 一次只能创建一个对象 , 而且需要写大量初始化代码 ;...- 使用 " 构造函数 " 方式 创建对象 ; 2、构造函数引入 创建对象时 , 属性方法结构都是相同 , 只是 属性值 不同 , 这里就可以通过 构造函数 只设置 不同 属性值 , 就可以...实现 批量构造 对象 ; 构造函数 也是一个函数 , 只是 其中 函数体 不是 普通代码 , 而是一个对象 ; 构造函数 本质 就是 把 对象 属性 方法 抽象出来 , 封装到 构造函数... 函数体 中 ; 3、构造函数语法 JavaScript 中 , 可以使用 " 构造函数 " 来创建对象 , 构造函数 本质上是一个普通函数 , 通常情况下 将 构造函数 函数首字母大写...使用 new 关键字调用构造函数,创建对象 var person = new Person('Tom', 18); 访问对象属性方法 : // 4.

9510

【C++】继承 ⑧ ( 继承 + 组合 模式对象 构造函数 析构函数 调用规则 )

一、继承 + 组合 模式对象 构造函数析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 类中 维护了一个 其它类型 成员变量 , 那么 该类 构造 与 析构 , 就需要涉及到...类 本身 构造函数 析构函数 , 父类 构造函数 析构函数 , 类 成员变量 构造函数 析构函数 ; 2、调用规则 继承 + 组合 情况下 , 构造函数 与 析构函数 调用规则如下...<< "C 析构函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 类对象中 , 涉及到 父类构造/析构函数 , 自身构造/析构函数...; A B 构造函数 , 是 父类构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数调用顺序为 : 父类 -> 成员 -> 自身 , 符合上述调用原则...; 然后分析 析构函数 调用顺序 ; C 析构函数 , 是 自身构造函数 ; D 析构函数 , 是 成员构造函数 ; A B 析构函数 , 是 父类构造函数 ; 析构函数调用顺序为 : 自身

16610

make_shared 正常 shared_ptr 构造函数什么区别

Object>("foo"); std::shared_ptr p2(new Object("foo")); 我看到很多人都推荐使用 make_shared,因为它比 shared_ptr 构造函数更高效...回答 它们区别在于 make_shared 只有一次内存申请操作,而 shared_ptr 构造函数会有两次。...shared_ptr 对象会管理两部分内容, 控制块,比如引用计数、deleter 等等 要被管理对象调用 make_shared 时候,会申请一份足够大内存同时给控制块对象使用。...而 shared_ptr 构造函数会分别为控制块对象调用内存申请,详情可以参考 cpprefrence – implementation notes。...当然 make_shared 这样做法也是弊端。当 shared_ptr 都离开了各自作用域,被管理对象也无法被析构。

1.4K20

JavaScript OOP(三):prototype原型对象(即构造函数prototype属性)

通过构造函数生成实例化对象,无法共享属性或方法(即每个实例化对象上都有构造函数属性方法);造成了一定资源浪费 1 function Obj(name,age){ 2 this.name...实际上所有函数都有自己原型对象;因为函数广义上可以认为是对象 对象作为其他对象原型对象,也能作为原型对象实例化对象,由此形成了prototype chain原型链 所有的对象原型对象如果一层层往上...constructor属性时定义构造函数prototype属性(原型对象),被所有实例化对象共享;所以实例化对象能够直接调用constructor属性 3.  ...构造函数生成实例化对象构造函数prototype属性就是实例化对象原型对象;原型对象属性方法被所有实例化对象所共享!  ...原型对象上有construtor属性,等于构造函数名;因为是定义原型对象上,所以被所有实例对象共享(由此我们也可以间接调用构造函数生成实例对象)!

1.1K70

JavaScript对象 ④ ( 构造函数对象联系 | new 操作符执行过程分析 )

一、构造函数对象联系 JavaScript 中 , 构造函数对象 之间 是 描述 与 实例 之间关系 ; 构造函数 是 用来创建特定类型对象函数 ; 对象 是 根据 构造函数 实例化出来具体实例...使用 new 构造函数() 创建对象过程 在上一篇博客 【JavaScript对象 ③ ( 使用 new Object 创建对象 | 使用 构造函数 创建对象 | 构造函数语法 | 使用 字面量 ...执行过程 如下 : 首先 , 创建空对象 , 使用 new 操作符 调用 构造函数 , 可以 内存空间 中 , 创建一个 空对象 ; 然后 , this 指针指向对象 , 将 构造函数 this...指针指向该 空对象 ; 新创建对象 __proto__ 会被链接到 构造函数 prototype 对象 , 该 空对象 就可以 访问 构造函数 中 定义 属性方法 ; 再后..., 设置属性方法 , 执行 构造函数代码 , 为 空对象 设置 属性 方法 ; this 关键字 构造函数 内部被设置为新创建对象 , 之后 执行构造函数代码 , 给新对象添加属性方法

9310

【C++】C++ 类中 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 构造函数设置默认参数值 | 返回匿名对象返回引用 )

, 这个增加参数是 对象本身指针 ; Student 类中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...return s; } 详细代码 , 参考最后完整代码示例 ; 二、构造函数设置默认参数值 ---- 为 Student 类定义了构造函数 , 则其默认无参构造函数 , 就不会生成...执行 Student 构造函数" << endl; } 此时 , 如果要创建 Student 对象 , 只能调用上述 构造函数 , 如果使用 Student s2 方式调用 默认构造函数 创建...Student 对象 , 就会报错 ; 如下带参数构造函数 , 并且为其 构造函数 参数 设置一个默认值 , 此时就可以使用 类名 对象方式定义对象变量 ; class Student...创建 Student 实例对象 Student s(18, 180); // 打印对象情况 s.print(); // 调用构造函数 , 构造函数参数使用默认值 Student s2

18120

javascript中常用创建对象方法工厂模式构造函数模式原型模式混合使用构造函数模式原型模式小结

,我们可以重复调用这个函数创建对象,每调用一次就会根传进去参数,创建一个新对象。...使用构造函数模式创建对象时候,只需要跟其他面向对象语言一样使用new操作符即可。...实际上,js使用构造函数模式创建对象过程中有以下几个步骤: 创建一个新对象对象作用域赋给新对象 调用构造函数代码为属性方法赋值 返回对象 其中,我们发现js帮我们封装了1,2,4等步骤...由此,我们就引出了下一种方法,原型模式 原型模式 原型对象简而言之,就是每个构造函数创建对象都有一个指针,这个指针指向它原形对象,而原形对象普通对象一样具有属性方法,但不同事,原形对象属性方法是让所有实例共享...** 需要注意是,如果实例对象原型对象存在相同属性方法,那么js会先从实例中搜寻,如果找到了就忽略原型对象,如果在实例中没有找到,就继续到原型中寻找 ** 混合使用构造函数模式原型模式

1.3K30

【C++修行之道】类对象(二)类6个默认成员函数构造函数、析构函数

2.2 特性 构造函数是特殊成员函数,需要注意是,构造函数虽然名称叫构造,但是构造函数主要任务并不是开空间创建对象,而是初始化对象。 其特征如下: 函数名与类名相同。 无返回值。...,返回一个日期类型对象 // warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义?)...实际应用中,通常建议构造函数中初始化这些成员,以确保对象状态是确定。...确保成员变量正确初始化:自动生成构造函数调用成员变量默认构造函数,确保 MyQueue 中两个 Stack 对象 MyQueue 对象创建时被正确初始化。...析构函数:与构造函数功能相反,析构函数不是完成对对象本身销毁,局部对象销毁工作是由编译器完成。而对象销毁时会自动调用析构函数,完成对象中资源清理工作。

8310

【C++】继承 ⑦ ( 继承中对象模型分析 | 继承中构造函数析构函数 )

int 类型空间 ; 3、问题引入 - 派生类对象构造函数析构函数调用 上述 继承 过程中 , 每一层继承 , 都继承了上一级 父类 成员变量 , 同时自己也定义了新成员变量 ; 派生类对象...构造时 , 构造函数如何进行调用 ; 派生类对象 析构时 , 析构函数如何进行调用 ; 本篇博客开始讨论上述问题 ; 4、完整代码示例 - 派生类对象内存模型 #include "iostream...---- 1、子类构造函数与析构函数调用顺序 继承中构造函数析构函数 : 子类构造 : 子类对象 进行 构造 时 , 需要调用 父类 构造函数 对 继承自父类 成员变量 进行 初始化 操作...; 然后 , 再调用 父类 析构函数 , 析构 继承自父类成员 ; 2、子类构造函数参数列表 如果 父类 构造函数 参数 , 则 需要再 子类 初始化列表中 显示调用 该有参构造函数...如果继承 A 类 , 如果 A 类默认构造函数 , B 类构造函数可以这么写 , 不显式调用 A 类构造函数 , 默认调用 A 类 无参 默认构造函数 ; class B : public

19940
领券