JS模拟面向对象全解(一、类型及传递)

 更新时间:2011年07月13日 00:08:24   作者:  
首先说明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在传递对象类型时,也拷贝了一份相应类型的对象,但是副本对象的所有属性、函数都是原对象的属性、函数。

相关文章

  • 页面js遇到乱码问题的解决方法是和无法转码的情况

    页面js遇到乱码问题的解决方法是和无法转码的情况

    在老项目里加些js文件和老项目的编码格式不一致出现乱码,由于两个文件都不能转格式,于是百度个不错的方法在此与大家分享下
    2014-04-04
  • 原生JS实现分享侧边栏

    原生JS实现分享侧边栏

    这篇文章主要为大家详细介绍了原生JS实现分享侧边栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • JavaScript判断是否为数组的3种方法及效率比较

    JavaScript判断是否为数组的3种方法及效率比较

    这篇文章主要介绍了JavaScript判断是否为数组的3种方法及效率比较,本文直接给出运行效果和实现代码,需要的朋友可以参考下
    2015-04-04
  • js中文逗号转英文实现

    js中文逗号转英文实现

    中文逗号如何转英文,下面为大家详细介绍下,感兴趣的朋友不要错过
    2014-02-02
  • 如何创建 JavaScript 自定义事件

    如何创建 JavaScript 自定义事件

    这篇文章主要介绍了如何创建 JavaScript 自定义事件,我们将通过文章学习到有关创建自定义事件,侦听自定义事件以及创建双击自定义事件所要了解的内容,需要的朋友可以参考一下
    2022-05-05
  • js和jquery使按钮失效为不可用状态的方法

    js和jquery使按钮失效为不可用状态的方法

    js和jquery如何使按钮失效,很简单,只要设置disabled属性为true即为不可用状态即可,下面有个简单的示例,大家可以参考下
    2014-01-01
  • 实现变速回到顶部的JavaScript代码

    实现变速回到顶部的JavaScript代码

    一般网页的下方都会放置一个置顶按钮, 尤其是页面底部没有导航的网页, 这样可以帮助访客重新找到导航或者重温一遍广告 (想得真美).
    2011-05-05
  • webpack与SPA实践之管理CSS等资源的方法

    webpack与SPA实践之管理CSS等资源的方法

    本篇文章主要介绍了webpack与SPA实践之管理CSS等资源的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 浅谈js算法和流程控制

    浅谈js算法和流程控制

    代码整体结构是执行速度的决定因素之一,代码量少不一定运行速度快,代码量多也不一定运行速度慢。本篇文章将对js的算法和流程控制进行介绍,下面跟着小编一起来看下吧
    2016-12-12
  • JS获取字符串实际长度(包含汉字)的简单方法

    JS获取字符串实际长度(包含汉字)的简单方法

    下面小编就为大家带来一篇JS获取字符串实际长度(包含汉字)的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08

最新评论