js构造函数详解

article/2025/9/14 18:22:12

典型的面向对象编程语言(比如C++和Java),存在“类”(class)这个概念。所谓“类”就是对象的模板,对象就是“类”的实例。但是,在JavaScript语言的对象体系,不是基于“类”的,而是基于构造函数(constructor)和原型链(prototype)

‘面向对象编程’的第一步,就是要生成对象。而js中面向对象编程是基于构造函数(constructor)和原型链(prototype)的。

前面说过,“对象”是单个实物的抽象。通常需要一个模板,表示某一类实物的共同特征,然后“对象”根据这个模板生成。
js语言中使用构造函数(constructor)作为对象的模板,所谓构造函数,就是提供一个生成对象的模板,并描述对象的基本结构的函数。一个构造函数,可以生成多个对象,每个对象都有相同的结构。

对于JS中的任何一个普通函数,当用new关键字来调用时,它就是构造函数。可见与函数定义无关,与调用方法有关。在社区中,通常默契地将函数名首字母大写来表示该函数以后希望被作为构造函数来使用

作用:构造新对象,设置对象的属性和方法
ECMAScript提供了多个内置构造函数,如 Object、Array、String、Boolean、Number、Date…等等。
var obj = new Object();
var arr = new Array();
ECMAScript也允许自定义构造函数

构造函数一般首字母会大写,为了和普通函数区分
一个构造函数可以通过new创建多个实例对象
创建构造函数时,里面的属性和方法前必须加this,this就表示当前运行时的对象

    function Person(name, height) {this.name = name;this.height = height;this.bark = function(fs){return fs}}var boy = new Person('Keith', 180);console.log(boy);  //Person {name: 'Keith', height: 180, bark: ƒ}console.log(boy.constructor);  //f Person(){}  //整个构造函数原型console.log(boy.bark(8));  //8console.log(boy.name); //'Keith'console.log(boy.height); //180
 function Cat1(name){           this.name = name;console.log(this)  //先打印 new的时候打印  Cat1 {name: 'kk'}  }var cat3 = new Cat1("kk");console.log(cat3);   //后打印  Cat1 {name: 'kk'} 指向原型链,再赋值

构造函数的return

  function Dog(){this.name = "贝贝";this.bark = function(){console.log("汪汪汪");}// return 0;// return [];}var d1 = new Dog();console.log(d1);//Dog {name: '贝贝', bark: ƒ}//构造函数不需要return 就可以返回结果

return一个基本数据类型,结果不变,依旧返回一个对象
例:

return 0;
console.log(d1);//Dog {name: '贝贝', bark: ƒ}

return一个复杂数据类型,返回一个复杂数据类型
例:

return [];
console.log(d1);//[]

构造函数构造出的对象带有类型标识

console.log(p1)  
Person {name: 'zs',age: 12,eating: [Function: eating],
}  //打印结果有类型标识  //Person 就是类型标识console.log(p1)
{name: 'zs', age: 12, eating:[Function: eating]} //无类型标识的

构造函数的原理(new之后发生了什么)
构造函数之所以能构造出对象,其实JS帮助我们做了很多骚操作。你以为new之后直接执行函数体代码,其实并不是,事实比我们看到了多了四步

在这里插入图片描述

1 自从用new调用函数后,JS引擎就会在内存中创建一个空对象{}
const newObj = {};
2 新对象的__proto__属性指向构造函数的原型对象
(通俗理解就是新对象隐式原型__proto__链接到构造函数显式原型prototype上。)

  newObj.__proto__ = functionName.prototype

3 构造函数内部的this会指向这个新对象(即将构造函数的作用域指向新对象)
this = newObj
4 从上到下执行函数体(只有这步是我们能直观看到代码的)
5 返回创造出来的对象(如果构造函数没有返回对象,则默认返回this。在函数体内部的this指向新创建的内存空间,默认返回 this 就相当于默认返回了该内存空间)

例子:

function Person(name, age) {this.name = name;this.age = age;this.eating = function() {console.log(this.name + ' is eating');}
}const p1 = new Person('zs', 12);//----------------------------------------------------------------------------
/*实际JS引擎帮助我们实现的操作*/
const newObj = {};
newObj.__proto__ = Person.prototype;
this = newObj;this.name = name;
this.age = age;
this.eating = function() {console.log(this.name + ' is eating');
}return newObj;

在构造函数原型上绑定方法节省空间

采用构造函数的确可以批量创建对象,且对象还都有该构造函数的logo,那么构造函数有什么缺点吗?有的。由于每次函数调用都会创建新的对象,对象中的函数(比如eating)也会创建多份,对于函数而言创建多份没有必要,能不能共用一个函数呢?

function Person(name, age) {this.name = name;this.age = age;}const p1 = new Person('zs', 12);// 在函数原型上添加方法
Person.prototype.eating = function() {console.log(this.name + ' is eating'); // zs is eatingreturn 5
}
console.log(p1.eating());  //5

将方法转移到构造函数原型上来定义后,对于实例对象p1,依然可以调用eating方法。调用p1的eating方法时,如果p1对象没有该方法,会去p1对象的原型对象p1.__proto_找,因为在构造p1时,绑定的原型:p1.__proto__ = Person.prototype,所以可以找到p1.__proto__.eating


http://chatgpt.dhexx.cn/article/NYbewJ0N.shtml

相关文章

JavaScript构造函数

什么是构造函数 构造函数(Constructor)的创建方式和普通函数一样。但通常首字母进行大写,用于和普通函数区分。 但是当一个函数创建好以后,我们并不知道它是不是构造函数(即使函数名的首字母为大写)。只有…

C#构造函数

在C#中,构造函数就是与类具有相同名称的成员函数,通常使用类中的构造函数来初始化类的成员属性。C#中的构造函数有三种: 第一种:实例构造函数。 当使用new关键字创建类的对象时,可以使用实例构造函数来初始化和创建类…

构造函数与拷贝构造函数

拷贝构造函数和构造函数不能分开说,他们都是初始化对象的一种方法。但是我们这里用构造函数辅助说明拷贝构造函数,主要说说拷贝构造函数的声明,用途和使用注意事项。 众所周知,构造函数是一个初始化类对象的函数,即使不…

C# 静态构造函数

目录 写在前面语法格式用法与特性主要作用语法特性 关于泛型的测试测试代码运行结果 写在前面 今天在创建WPF自定义控件时,在模板代码中看到了静态构造函数这种写法,说来惭愧,以前在Java用过这种语法,心知C#也应该会有的&#xf…

构造函数详解

构造函数详解 类的6个默认的成员函数 构造函数的概念: 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。…

C++中的指针类型与构造函数,析构函数

1. 指针类型的作用 1.1 指针取出字节 任何类型的指针占用的空间大小都是相同的 (32位CPU是4字节;64位CPU是8字节) 既然任何类型的指针占用的空间大小都是相同的,为什么指针还需要类型呢? 指针只是指向了一个内存地址…

c++拷贝构造函数

一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a 100; int b a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个类对象拷贝的简单…

C++构造函数

文章目录 1 构造函数的定义及特征2 默认构造函数2.1 合成的默认构造函数2.1.1 默认初始化2.1.2 合成的默认构造函数初始化类成员变量的规则2.1.3 有些场合不能使用合成的默认构造函数 2.2 全缺省的默认构造函数(参数都为默认实参的构造函数) 3 构造函数初…

C++ 构造函数详解

目录 0. 什么是构造函数 1. 默认构造函数 2. 一般构造函数 3. 拷贝构造函数 4. 转换构造函数 5. 移动构造函数 0. 什么是构造函数 在定义类的成员函数的时候,一般的成员函数与普通的全局函数没有太大的区别,在定义函数的时候都需要说明要返回的类…

【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数

🔥 🔥 🔥 🔥 🔥 火速猛戳订阅 👉 《C要笑着学》 👈 趣味教学博客 🔥 🔥 🔥 🔥 🔥 [ 本篇博客热榜最高排名:7 ] 写在前…

JSF 文档参考

转自:http://blog.csdn.net/ontheway20/article/details/38532241 A4J 用户指南 目录 1. 介绍 2. 开始使用Ajax4jsf 环境需求 下载Ajax4jsf 安装 简单的 AJAX Echo 项目 JSP 页面 数据 Bean faces-config.xml Web.xml 部署 3. Ajax4jsf 框架的基本概念 介绍 结构概…

IDEA 2020.2 部署JSF项目

目录 一、用Glassfish部署JSF项目 1、下载glassfish 2、配置glassfish环境变量 3、修改jdk环境变量 4、测试glassfish是否可以正常启动 5、在IDEA中创建一个JSF项目 6.问题:部分标签元素无法显示 二、用tomcat部署JSF项目 1、新建项目或者模块,…

JSF教程(1)——简介 + HelloWorld

在写第一个HelloWorld之前先来宏观的了解一下JSF,也许你之前使用过Struts(1或者2),SpringMVC,甚至于直接采用JSPServelet开发过web层。JSF与这些最大的不同是JSF是基于一种以组件为中心的用户界面(UI&#…

JSF程式

概述: jsf使用spring的依赖注入的思想使得页面和业务逻辑更好的分离开来,页面与页面的跳转,逻辑关系,页面与后台不同的beans的对应和操作都是通过faces-config.xml文件来说明和配置。对程序员的要求不高,页面程序员可…

谈谈京东的服务框架JSF

谈谈京东的服务框架 最近由于在实习期间接触到了京东的自研服务框架JSF,简称“杰夫”,目前我写的一些新功能里面调用的下游接口就是杰夫提供的。现有有很多高效的服务框架,如阿里巴巴的Dubbo配合Apache的ZooKeeper,那么为什么京东…

JSF 转换与验证

在本文中,我们将介绍 JSF 转换和验证框架的概念,它比您所想的要容易使用得多,也灵活得多。 首先我们将介绍应用于 JSF 生命周期的转换和验证过程,然后展示一个简单的 JSF 应用程序中的默认转换和验证过程。接着将展示如何创建和插…

JSF----------基础知识初解

初次学习JSF,对其基础进行了一些学习与整理。 JSF(JavaServer Faces)它是一个基于服务器端组件的用户界面框架。 它用于开发Web应用程序。 它提供了一个定义良好的编程模型,由丰富的API和标签库组成。最新版本JSF 2使用Facelets作为其默认模板系统。 它是用Java编写…

JSF详解

1. 结构: a) 结构图: b) 说明:JSF以MVC模式为基础,与Struts不同,JSF的目标是希望以一个与Swing相类似的方式来开发网页,因此,从JSF的结构图当中,他的核心…

JSF框架整理(一)

一、框架简介 JavaServer Faces (JSF) 是一种用于构建Java Web 应用程序的标准框架,它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器端应用程序的开发。 典型的JSF应用程序包含下列部分: 一组J…

JSF简介

JSF简介 一、 什么是 JSF : JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法,从而简化了开发。 JavaServer Faces于2004年三月1.0版正式提出,清楚的将Web应…