JS模拟面向对象全解(一、类型及传递)_Javascript教程-查字典教程网
JS模拟面向对象全解(一、类型及传递)
JS模拟面向对象全解(一、类型及传递)
发布时间:2016-12-30 来源:查字典编辑
摘要:可是,没有类,何来面向对象一说?没有关系,可以模拟。而且这一套方法已经成为公认的JS实现面向对象的方法。另外,JS内的东西完全开发,也就不存...

可是,没有类,何来面向对象一说?没有关系,可以模拟。而且这一套方法已经成为公认的JS实现面向对象的方法。

另外,JS内的东西完全开发,也就不存在成员的什么private、protected作用域。

下面切入正题。

一、类型//从基础开始,省的后面看着吃力

1、类型的区别

基本数据类型和对象类型不是一回事。

a、基本类型只是一个值,没有任何行为;而对象类型有自己的行为。

b、基本类型是值类型,仅表示一个值;对象类型则拥有许多复杂的东西。

c、基本类型传递时传值,对象类型传递时传址。

另外,文本非常特殊,JS里面有两种文本类型——一种基本数据类型,一种对象类型。 举个例子:

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();,都是对象类型(JS有许多对象,算是精简的面向对象语言) 请注意:基本数据类型也可以new,但是很少有那种用法。因此上述区分办法不完全适用所有情况,请加以自行判断。

2、参数传递方式 这一节主要来区分传址、传值。 仍然拿例子来说事:

复制代码 代码如下:

function changeVar(varible){

varible=5;

alert(varible);//提示5

}

var a=3;

alert(a);//提示3

changeVar(a);//该函数内部有改变参数的代码 alert(a);//仍然提示3

根据上例可以发现,函数虽然改变了参数,但是并没有改变参数所代表的传递过去变量。这是传值。在调用changeVar时,JS重新拷贝了一份你传递的变量作为参数,所以,在changeVar内部操作的参数实际上是你传递的变量的副本,而非本身。 传递的其实是变量的值,而非变量本身。这叫做传值。

复制代码 代码如下:

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之后,原来的变量的对应属性也发生改变,函数内部就是操作的传递的变量本身。 传址就是这个道理,把你给定的变量的内存地址传递过去,函数内部改变的其实就是你传递的变量。因为操作的都是在统一内存地址的东西。

但是,一定注意这个“但是”!JS的传址还是有些特别之处! JS在传递对象类型时,大概也拷贝了一份相应类型的对象,但是副本对象的所有属性、函数都是原对象的属性、函数。 也许就是,属性传址而对象不传址。 这个特点可以证明。 代码如下:

复制代码 代码如下:

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

当你改变了参数代表的对象时,并未改变的了你传递的变量代表的对象。但前面说过,可以通过函数内对参数对象的属性操作改变原变量代表对象的属性。这结合起来就可以证明,JS在传递对象类型时,也拷贝了一份相应类型的对象,但是副本对象的所有属性、函数都是原对象的属性、函数。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Javascript教程学习
    热门Javascript教程学习
    编程开发子分类