js 中的构造函数,构造函数作用,构造函数和普通函数的区别

js 中的构造函数,构造函数作用,构造函数和普通函数的区别函数的定义方式:1.声明式函数定义:function函数名(){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。2.函数表达式:letfun=function(){};此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun===undefined。3.newFunction形式:varfun1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

函数的定义方式:
1.声明式函数定义: function 函数名 (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。
2.函数表达式:let fun = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。
3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。

构造函数
在 JavaScript 中,用 new 关键字来调用的函数,称为构造函数。构造函数首字母一般大写(规范)。
之所以有构造函数与普通函数之分,主要从功能上进行区别的,构造函数的主要 功能为 初始化对象,特点是和new 一起使用。new就是在创建对象,从无到有,构造函数就是在为初始化的对象添加属性和方法。

1、常用的构造函数:
 var arr = []; 为 var arr = new Array();
 var obj = {} 为 var obj = new Object();
 var date = new Date();
 
2、执行构造函数时发生的事 :

let p = new Person();
function Person(name,age,sex){ 
   
	this.name = name;
	this.age = age;
	this.sex = sex;
}
Person.prototype.say = function(){ 
   
	console.log('定义了一个Person的新方法say');
}
let f = new Person ('青衣浏阳',18,'男');  // f.name = '青衣浏阳';f.age = 18; f.sex = '男';
f.say();     //定义了一个Person的新方法say

构造函数会有以下几个执行过程
(1) 当以 new 关键字调用时,会创建一个新的内存空间,标记为 Animal 的实例。
(2)函数体内部的 this 指向该内存

var f1 = new Person('ls',20, '女');  // 创建一个新的内存 #f1
var f2 = new Person('lss',22, '女');  // 创建一个新的内存 #f2

每当创建一个实例的时候,就会创建一个新的内存空间(#f1, #f2),创建 #f1 的时候,函数体内部的 this 指向 #f1, 创建 #f2 的时候,函数体内部的 this 指向 #f2。

(3) 执行函数体内的代码
就是给 this 添加属性,就相当于给实例添加属性。
(4) 默认返回 this
由于函数体内部的this指向新创建的内存空间,默认返回 this ,就相当于默认返回了该内存空间,也就是上图中的 #f1。此时,#f1的内存空间被变量p1所接受。也就是说 p1 这个变量,保存的内存地址就是 #f1,同时被标记为 Person 的实例。
以上就是构造函数的整个执行过程。

3、用new和不用new调用构造函数,有什么区别?

1、用new调用构造函数,函数内部会发生如下变化:
创建一个this变量,该变量指向一个空对象。并且该对象继承函数的原型;
属性和方法被加入到this引用的对象中;
隐式返回this对象(如果没有显性返回其他对象)
简单的说 用new调用构造函数,最大特点为,this对象指向构造函数生成的对象

2、如果直接调用函数,那么,this对象指向window,并且,不会默认返回任何对象(除非显性声明返回值)。

4、构造函数的返回值
构造函数执行过程的最后一步是默认返回 this 。言外之意,构造函数的返回值还有其它情况。
没有手动添加返回值,默认返回 this。手动添加一个基本数据类型的返回值,最终还是返回 this。

function P() { 
   
 this.name = '青衣浏阳';
}
var p1 = new P();
console.log(p1)  //Person1 {name: "青衣浏阳"}

手动添加一个复杂数据类型(对象)的返回值,最终返回该对象。

function P2() { 
   
  this.sex = '男';
  return { 
    sex: '女' };
}
var p3 = new P2();
console.log(p3.sex);  //女

5、构造函数有什么用?
当你需要大批量的写对象的时候,就需要用到构造函数,它可以方便创建多个对象的实例,并且创建的对象可以被标识为特定的类型,可以通过继承扩展代码

举个例子,我们要录入很多同学的个人信息,那么我们可以创建一些对象,比如:

var p1 = { 
    name: 'zs', age: 6, sex: '男'};
var p2 = { 
    name: 'ls', age: 6, sex: '女'};
var p3 = { 
    name: 'ww', age: 6, sex: '女'};
var p4 = { 
    name: 'zl', age: 6, sex: '男'};

像上面这样,我们可以把每一位同学的信息当做一个对象来处理。但是,我们会发现,我们重复地写了很多无意义的代码。比如 name、age、sex 。如果这个班上有60个学生,我们得重复写60遍。

这个时候,构造函数的优势就体现出来了。我们发现,虽然每位同学都有 name、age、sex这些属性, 但它们都是不同的,那我们就把这些属性当做构造函数的参数传递进去。此时,我们就可以创建以下的函数:

function Person(name,age, sex,) { 
   
    this.name = name;
    this.age = age;
    this.sex= sex;
}

当创建上面的函数以后, 我们就可以通过 new 关键字调用,也就是通过构造函数来创建对象了。

var p1 = new Person('zs', 5,'男');
var p2 = new Person('luci', 5,'女');
var p3 = new Person('jack', 6,'男');
var p4 = new Person('lusi', 6,'女');

此时你会发现,创建对象会变得非常方便。所以,虽然封装构造函数的过程会比较麻烦,但一旦封装成功,我们再创建对象就会变得非常轻松,这也是我们为什么要使用构造函数的原因。
在使用对象字面量创建一系列同一类型的对象时,这些对象可能具有一些相似的特征(属性)和行为(方法),此时会产生很多重复的代码,而使用构造函数就可以实现代码复用。

6、 构造函数和普通函数的区别
1、构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写。
2、调用方式不一样。
普通函数的调用方式:直接调用 person();
构造函数的调用方式:需要使用new关键字来调用 new Person();
3、构造函数的函数名与类名相同:Person( ) 这个构造函数,Person 既是函数名,也是这个对象的类名。(ES6 中 class 与构造函数的关 系,通过class定义的类 和通过构造函数定义的类 二者本质相同。并且在js执行时,会将第一种转会为第二种执行。所以 ES6 class的写法实质就是构造函数)
4、内部用this 来构造属性和方法
5、构造函数的执行流程
A、立刻在堆内存中创建一个新的对象
B、将新建的对象设置为函数中的this
C、逐个执行函数中的代码
D、将新建的对象作为返回值
6、构造函数的返回值默认是this 也有其他情况 。普通函数:因为没有返回值,所以为undefined

写在最后,如有错误欢迎留言指正和补充~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196072.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java的invoke方法[通俗易懂]

    Java的invoke方法[通俗易懂]如果读一些Java或者相关框架的源码,实际上一定会经常出现invoke方法的调用,在自己或者团队封装框架时,如果有时候弄得不好经常也会报invoke相关的错。invoke方法是干什么的?有什么具体用途?首先要了解invoke方法干什么的以及具体用途,实际你要搞清他在源码那个class文件上,他在那个包里,追根溯源。invoke方法来自Method类,可能不会像我们经常用到的基础类型包装类,以及集合类还有他们的扩展和工具类使用的那么多。但是Method类所在的包可是大名鼎鼎的反射Reflact,不是有

  • apt-get 出现的 GPG error 问题[通俗易懂]

    apt-get 出现的 GPG error 问题[通俗易懂]在本本装上Debian后,用apt-getupdate更新软件源时,出现以下warning:GPGerror:http://debian.linux.org.twetchRelease:由于没有公钥,下列签名无法进行验证:NO_PUBKEY07DC563D1F41B907解决方案:首先,确保已经安装了以下程序#apt-getinstallgnupg然后,手动导入所需公钥#gpg

    2022年10月12日
  • ios8绘图方法小记touchesBegan&touchesMoved

    ios8绘图方法小记touchesBegan&touchesMoved////MyView.swift//L01Test////Createdbyrobertkunon15/9/7.//Copyright(c)2015MAC.Allrightsreserved.//importUIKitclassMyView:UIView{varpath=CGPathCreateMutable()//On

  • 用matlab绘制二元函数图像_心形函数表达式

    用matlab绘制二元函数图像_心形函数表达式文章目录Matlab二元函数图像绘制plot3函数的基本用法fplot3函数基本用法进阶用法绘制二元函数图像Matlab二元函数图像绘制在讲二元函数图像绘制之前,先讲解plot3与fplot3的实际用法,之后再讲解二元函数图像绘制,有需要的同学可直接跳转查看。plot3函数的基本用法本节通过循序渐进的方法,先介绍简单的plot3用法,接着再一步一步进阶难度,并且在代码中给出每块代码的功能以及使用方法,以帮助大家更快的学习使用。实例1:绘制三维直线%给定x、y、z的数值x=[1,2,3];

  • Delphi教程推荐

    Delphi教程推荐
    非常适宜Delphi初学者。选择Delphi开发同学的眼光是不错的,由于使用Delphi开发应用软件可以提高编译的效率,前提是你要好好学习Delphi教程,对你以后的开展肯定有很大帮助的。  Delphi(Delphi培训)是Borland公司研制的新一代可视化开发工具,它应用范围非常广,无论是Windows系统还是LINUX系统上都能完美运行。  书名:《Delphi2005程序设计教程》  作/译者:刘瑞新  出版社:机械工业出版社  出版日期:2005年07月  内容提要 

  • 软件工程:数据流图和结构图怎么画?

    软件工程:数据流图和结构图怎么画?文章目录Step1:根据软件的功能描述,绘制数据流图:Step2:根据数据流图,分级绘制结构图:•边界划分:•第一级分解:•第二级分解:•精化减少耦合:Step1:根据软件的功能描述,绘制数据流图:问题表述:假设的仪表板将完成下述功能:(1)通过模数转换实现传感器和微处理机接口;(2)在发光二极管面板上显示数据;(3)指示每小时英里数(mph),行驶的里程,每加仑油行驶的英里数(mpg)等等;(4)指示加速或减速;(5)超速警告:如果车速超过55英里/小时,则发出超速警告铃声。首先了

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号