javaScript的构造函数和java的构造函数区别

news/2025/11/16 14:06:59/文章来源:https://www.cnblogs.com/BKYNEKO/p/19126076

核心思想差异:

  • Java的构造函数:基于严格的“类”(Class),像一个工业模具。一旦设计好,就按照这个模具精确地生产出一模一样的产品。

  • JavaScript的构造函数:基于灵活的“原型”(Prototype),更像一个手工作坊。有一个核心的师傅(构造函数),还有一个所有产品都能使用的公共“工具墙”(原型)。


 

1. Java:工业模具 (class)

在Java中,你必须先定义一个 class。这个 class 是一个非常严格和完整的蓝图,它详细规定了对象应该有哪些属性(字段)和行为(方法)。**构造函数(Constructor)**只是这个蓝图中的一个特殊部分,它的唯一职责是在用模具生产出产品时,进行“初始化填充”。

【示例】

// 1. 定义一个精确的工业模具:Person Class
public class Person {// 模具规定了产品必须有一个 name 属性public String name;// 构造函数:模具的“注料口”,负责在创建时将初始材料("Alice")注入public Person(String initialName) {this.name = initialName;}// 模具规定了产品必须有一个 sayHello 的行为public void sayHello() {System.out.println("Hello, I am " + this.name);}
}// 2. 使用模具进行生产
// new Person("Alice") 就是用 Person 模具生产一个实例,并通过构造函数注入"Alice"
Person alice = new Person("Alice"); 
alice.sayHello(); // 输出: Hello, I am Alice

总结 (Java):

  • new 的是 class(模具)。

  • 构造函数是 class 的一部分,负责初始化

  • 产出的是一个严格按照 class 蓝图定义的对象实例。


 

2. JavaScript:手工作坊 (function + prototype)

在JavaScript(经典原型模式下),没有 class 这个刚性模具。你只有一个**“师傅”(构造函数)和一个“公共工具墙”(原型 prototype)**。

  • 构造函数 function Person(name){...}:这是**“师傅”本人**。他的任务是承接一个订单,拿到一个空的毛坯房(新对象),然后做一些个性化的装修(比如在墙上刻上名字 this.name = name)。

  • 原型 Person.prototype:这是作坊里的**“公共工具墙”**。上面挂着所有产品都能使用的工具(比如 sayHello 这个方法)。把工具挂在这里的好处是,不用给每个产品都单独配一套工具,节省了材料(内存)。

【示例】

// 1. 定义“师傅”的工作内容 (构造函数)
function Person(name) {// 师傅接到新对象后,进行个性化装修:刻上名字this.name = name; 
}// 2. 在“公共工具墙”上挂一个新工具并命名为 sayHello (在原型上定义方法)(最后有解释)
Person.prototype.sayHello = function() {console.log(`你好!我是 ${this.name}。`);
};// 3. 让师傅开始工作,生产一个新产品
// new Person("Alice") 就是让 Person 师傅创建一个新产品,并刻上名字"Alice"
const alice = new Person("Alice");// 4. 使用产品
// 当调用 alice.sayHello() 时,alice 自己身上没有这个工具,
// 于是它会回到师傅的“公共工具墙”(Person.prototype)上找到并使用这个工具。
alice.sayHello(); // 输出: 你好!我是 Alice。

总结 (JavaScript):

  • new 的是一个普通函数,但 new 这个动作赋予了它“构造”的能力。

  • 构造函数负责处理每个实例独有的属性。

  • prototype 负责存放所有实例共享的方法。

  • 产出的是一个对象,这个对象通过一条看不见的线(原型链)连接着那个“公共工具墙”。


 

new 关键字到底做了什么?一张图看懂区别

 

  在 Java 中 (new Person(...)) 在 JavaScript 中 (new Person(...))
第一步 寻找 Person 类的定义(找模具) 创建一个通用的、空的对象 {}
第二步 Person 对象分配内存 将空对象的__proto__指向Person.prototype(连接到工具墙)
第三步 调用 Person 构造方法初始化对象 调用Person函数,this指向新对象(让师傅装修)
第四步 返回初始化完毕的对象引用 返回装修好的新对象

 

核心差异

Java 是预先规划、静态定义的。你必须先设计好完整的 class 模具,才能生产。

JavaScript 是动态、灵活的。你有一个负责个性化加工的函数,和一个可以随时增删工具的公共原型。这种“组合”的方式来定义一类对象。虽然现在ES6引入了 class 语法,但其底层原理依然是基于原型的这套“作坊模式”。

 

 

Person.prototype.sayHello = function() { console.log(`你好!我是 ${this.name}。`); };

把它看作一个句子来解读:

  • Person: 这是我们自定义的构造函数。在JavaScript中,函数本身也是一个对象。既然是对象,它就可以拥有自己的属性。

  • . (点): 这是对象属性的访问符。我们准备访问 Person 对象上的一个属性。

  • prototype: 这就是最关键的部分。prototype (原型) 是每一个函数对象天生就有的一个属性。你不需要自己创建它,只要你定义一个函数,JavaScript就会自动为这个函数配上一个 .prototype 属性。

    • 这个 .prototype 属性的值,本身也是一个对象。默认情况下,它是一个近乎空的对象。

    • 可以把 Person 函数想象成一个“作坊”的品牌名,那么 Person.prototype 就是这个作坊里那面真实存在的“公共工具墙”

  • .sayHello: 这是我们正在Person.prototype 这个“工具墙”对象添加一个新属性,属性名由我们自定义为 sayHello。这就像在工具墙上钻一个孔,准备挂工具。

  • = function() { ... }: 这是我们赋给 sayHello 属性的。因为这个值是一个函数,所以 sayHello 就成了一个方法。这就像把一个真正能用的“打招呼”工具挂在了墙上。

所以,整行代码的真正含义是:

“找到 Person 这个函数对象,访问它自带的那个名叫 prototype 的属性(它是一个对象),然后给这个 prototype 对象新增一个名叫 sayHello 的属性,并让这个属性的值等于我们定义的这个新函数。”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/171996.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一次幸运的ORA-07445 kdxlin故障恢复---惜分飞

一次幸运的ORA-07445 kdxlin故障恢复---惜分飞联系:手机/微信(+86 17813235971) QQ(107644445) 标题:一次幸运的ORA-07445 kdxlin故障恢复 作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步…

Postgres数据库truncate表无有效备份恢复---惜分飞

Postgres数据库truncate表无有效备份恢复---惜分飞联系:手机/微信(+86 17813235971) QQ(107644445) 标题:Postgres数据库truncate表无有效备份恢复 作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则…

03-spirngIOC02-通过注解实现IOC

03-spirngIOC02-通过注解实现IOC$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");通过注解实现IOC实现实体类 package com.zhongge.entity;import jakarta.an…

02-springIOC01-注解方式实现

02-springIOC01-注解方式实现$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");使用注解的方式实现IOC 定义两个实体类 /*** @ClassName Address* @Descriptio…

US$28.5 CG A11DS 3 Buttons Wire Remote Used with CGDI K2 Remote Key Programmer 5pcs/lot

CG A11DS 3 Buttons Wire Remote Used with CGDI K2 Remote Key Programmer 5pcs/lot Package includes:5pc x CG A11DS 3 Buttons Wire Remote Pictures of CG A11DS 3 Buttons Wire Remote Used with CGDI K2 Remote…

US$137.75 OTOFIX D1 One Year Update Service (Subsription Only)

OTOFIX D1 One Year Update Service (Subsription Only)1. Please send us the device serial number with picture to our Email 2. No Need Shipping. No refund service3. This is Only for Software Update, Witho…

macOS Sequoia 15.7.1安全更新:修复字体解析器内存损坏漏洞

苹果发布了macOS Sequoia 15.7.1安全更新,修复了FontParser组件中的越界写入漏洞。该漏洞可能被恶意字体文件利用,导致应用程序意外终止或进程内存损坏。更新可通过Mac App Store或苹果官网下载获取。APPLE-SA-09-29…

AtCoder Beginner Contest 426 ABCDEF 题目解析

A - OS Versions 题意 有三种操作系统的版本,按发布时间顺序分别为 Ocelot、Serval、Lynx。 给定字符串 \(X, Y\),请判断版本 \(X\) 相比于版本 \(Y\) 的发布时间是否相同或更靠后(版本相同或更新)。 思路 直接判断…

AI训练的悖论:为什么越追求准确率越会产生幻觉?

在早期时,我曾让大模型撰写一位冷门历史人物的传记。它胸有成竹,娓娓道来:年代、成就,甚至几句“名言”,一应俱全。读起来简直像历史上真的存在一样。 唯一的问题是:大部分内容都不是真的。严格来说,模型并非“…

US$78.85 CG ZA11 BEN.Z(3BTN) 3 Buttons Smart Remote Used with CGDI K2 Remote Key Programmer 5pcs/lot

CG ZA11 BEN.Z(3BTN) 3 Buttons Smart Remote Used with CGDI K2 Remote Key Programmer Package includes:5pc x CG ZA11 BEN.Z(3BTN) 3 Buttons Smart Remote Pictures of CG ZA11 BEN.Z(3BTN) 3 Buttons Smart Remo…

鲜花 10.4:【半 whk 向】临项交换法贪心

题源:青岛 58 中高一作业。新定义能这么出? 直接考虑(3),这是一个经典问题 [NOIP 2012 提高组] 国王游戏 的模型,即临项交换法贪心。 题意即重排一个给定的二元组序列,使得 \(\max_{i=1}^n f_i\) 最小,其中, …

详细介绍:CompLLM 来了:长文本 QA 效率革命,线性复杂度 + 缓存复用,推理速度与效果双丰收

详细介绍:CompLLM 来了:长文本 Q&A 效率革命,线性复杂度 + 缓存复用,推理速度与效果双丰收2025-10-04 22:43 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !…

基于pycharm实现html文件的快速达成问题讨论

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

一篇计算机类的论文的结构/架构是怎么样的?

一篇计算机类的论文的结构/架构是怎么样的?本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主…

回忆QQ空间有感

有意思写着写着发现回忆是一条找不到归途的路,只会在里面越陷越深。文学大师 发现自己小学~初一阶段特别喜欢写诗/杂文并分享到QQ动态里面:科技与自然 孤鸿 小时候,对雨总是有种莫名的期盼:雨天,身披着雨衣,脚穿…

mtgsig

mtgsig、mtgsig1.2声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! wx a1501860187…

详细介绍:Java-Spring 入门指南(十七)SpringMVC--Apipostl与RestFul实战测试

详细介绍:Java-Spring 入门指南(十七)SpringMVC--Apipostl与RestFul实战测试pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

详细介绍:告别 403 Forbidden!详解爬虫如何模拟浏览器头部(User-Agent)

详细介绍:告别 403 Forbidden!详解爬虫如何模拟浏览器头部(User-Agent)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

深入解析:从 CefSharp 迁移至 DotNetBrowser

深入解析:从 CefSharp 迁移至 DotNetBrowser2025-10-04 22:18 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

【STM32项目开源】基于STM32的智能养殖场环境监测系统 - 详解

【STM32项目开源】基于STM32的智能养殖场环境监测系统 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…