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


Posted in Javascript onJuly 13, 2011

可是,没有类,何来面向对象一说?没有关系,可以模拟。而且这一套方法已经成为公认的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表单验证要注意的事项
Sep 29 Javascript
jQuery中animate()方法用法实例
Dec 24 Javascript
jQuery DOM删除节点操作指南
Mar 03 Javascript
javascript每日必学之多态
Feb 23 Javascript
Bootstrap每天必学之滚动监听
Mar 16 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
Jun 09 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
Nov 29 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
Feb 21 Javascript
layer实现关闭弹出层刷新父界面功能详解
Nov 15 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
Mar 08 Javascript
layui-table获得当前行的上/下一行数据的例子
Sep 24 Javascript
OpenLayer学习之自定义测量控件
Sep 28 Javascript
一些实用的jQuery代码片段收集
Jul 12 #Javascript
formValidator3.3的ajaxValidator一些异常分析
Jul 12 #Javascript
在IE浏览器中resize事件执行多次的解决方法
Jul 12 #Javascript
JQuery获取当前屏幕的高度宽度的实现代码
Jul 12 #Javascript
Jquery进度条插件 Progress Bar小问题解决
Jul 12 #Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
Jul 11 #Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
Jul 11 #Javascript
You might like
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
python中常用的九种预处理方法分享
2016/09/11 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
使用python进行拆分大文件的方法
2018/12/10 Python
python将pandas datarame保存为txt文件的实例
2019/02/12 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
html5 标签
2009/07/16 HTML / CSS
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
财务会计专业应届毕业生求职信
2013/10/18 职场文书
大门门卫岗位职责
2013/11/30 职场文书
演讲稿怎么写才完美
2014/01/02 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
演讲主持词
2014/03/18 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
项目合作协议书
2014/09/23 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
自主招生学校推荐信
2014/09/26 职场文书
投标邀请书范本
2015/02/02 职场文书
经营场所证明范本
2015/06/19 职场文书