JavaScript面向对象模拟基础:类型与参数传递机制
本文解析JavaScript中模拟面向对象的核心基础,重点区分基本数据类型与对象类型的本质差异。通过代码示例详细阐述函数参数传递机制:基本类型采用传值方式,传递的是值的副本;对象类型采用传址方式,传递的是内存引用。同时揭示JS对象传递的特殊性:虽拷贝对象结构,但属性仍共享原对象地址,导致修改属性会影响原对象,而重新赋值参数则不会。
JavaScript面向对象模拟基础
尽管JavaScript原生没有类的概念,但这并不妨碍我们模拟面向对象编程。事实上,这种模拟方法已成为JavaScript中实现面向对象特性的公认标准方案。
此外,由于JavaScript语言特性完全开放,因此不存在传统面向对象语言中private或protected这样的成员访问作用域限制。
接下来我们进入核心内容。
类型区别与参数传递机制
一、类型 //从基础开始,省的后面看着吃力
1、类型的区别
基本数据类型和对象类型在本质上是不同的。
a、基本数据类型仅包含一个值,不具备任何行为方法;而对象类型则拥有特定的行为和功能。
b、基本数据类型属于值类型,仅表示一个具体的值;对象类型则包含更为复杂的结构和功能。
c、在传递基本数据类型时,传递的是具体的值;而在传递对象类型时,传递的是内存地址。
另外,字符串类型非常特殊,JavaScript中存在两种字符串表现形式:一种属于基本数据类型,另一种属于对象类型。具体举例如下:
var str="The End";//这样是基本数据类型,传递方式就是传值
var str2=new string("The End");//这就不同,有了new这个为对象开辟内存空间的标识符,对应的变量就会成为对象类型,传递时即传址
简单来说: a、直接使用字面量赋值的变量,例如var a=1;var b="a";var c=true;,均属于基本数据类型(常见的包括数值、字符串、布尔值)。
b、使用new关键字赋值的变量,例如var a=new Object();var b=new string();,均属于对象类型(JavaScript拥有众多内置对象,可视为一种精简的面向对象语言)。 请注意:基本数据类型也可以使用new关键字,但这种用法较为罕见。因此,上述区分方法并非适用于所有情况,需要读者自行判断。
2、参数传递方式 本节主要探讨传值与传址的区别。 继续使用示例进行说明:
代码如下:
function changeVar(varible){
varible=5;
alert(varible);//提示5
}
var a=3;
alert(a);//提示3
changeVar(a);//该函数内部有改变参数的代码 alert(a);//仍然提示3 根据上述示例可以发现,尽管函数内部修改了参数变量,但并未改变调用时传入的原始变量。这体现了传值机制。在调用changeVar函数时,JavaScript会重新拷贝一份传入变量的值作为参数,因此函数内部操作的是该变量的副本,而非变量本身。传递的实际上是变量的值,而非变量引用,这被称为传值。
代码如下:
function changeVar(varible){
varible.x=5;
alert(varible.x);//提示5
}
var a=new Object;
a.x=3 alert(a.x);//提示3
changeVar(a);//该函数内部有改变参数的代码
alert(a.x);//提示5 上述示例修改为使用Object对象。结果显示,调用changeVar函数后,原始变量的对应属性也发生了改变,说明函数内部操作的是传入变量本身。这就是传址机制:将给定变量的内存地址传递过去,函数内部对属性的修改实际上直接作用于原变量,因为操作的是同一内存地址的数据。
但是,必须注意这个“但是”!JavaScript的传址机制具有一些特殊之处! 当传递对象类型时,JavaScript大致也会拷贝一份相应类型的对象结构,但该副本对象的所有属性和函数都指向原对象的属性和函数。 换言之,可能是属性传址而对象本身不传址。 这一特点可以通过以下代码证明。
代码如下:
function changeVar(varible){
varible=new Object();
varible.x=5;
alert(varible.x);//提示5
}
var a=new Object;
a.x=3 alert(a.x);//提示3
changeVar(a);//该函数内部有改变参数的代码
alert(a.x);//提示3 当你重新为参数赋值新对象时,并未改变传入变量所代表的原对象。但前文提到,可以通过函数内对参数对象属性的操作来改变原变量代表对象的属性。结合这两点可以证明:JavaScript在传递对象类型时,确实拷贝了一份相应类型的对象结构,但该副本对象的所有属性和函数引用均指向原对象的属性和函数。
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
相关标签:
