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 相关文章推荐
js左侧多级菜单动态的解决方案
Feb 01 Javascript
返回对象在当前级别中是第几个元素的实现代码
Jan 20 Javascript
基于JQuery的动态删除Table表格的行和列的代码
May 12 Javascript
利用js实现选项卡的特别效果的实例
Mar 03 Javascript
javaScript 计算两个日期的天数相差(示例代码)
Dec 27 Javascript
10分钟学会写Jquery插件实例教程
Sep 06 Javascript
jQuery制作仿Mac Lion OS滚动条效果
Feb 10 Javascript
JavaScript中标识符提升问题
Jun 11 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
Nov 17 Javascript
JavaScript反射与依赖注入实例详解
May 29 Javascript
一些手写JavaScript常用的函数汇总
Apr 16 Javascript
jQuery 选择器用法实例分析【prev + next】
May 22 jQuery
一些实用的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
php输出xml格式字符串(用的这个)
2012/07/12 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
详解express + mock让前后台并行开发
2018/06/06 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
python实战教程之自动扫雷
2018/07/13 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
python实现的Iou与Giou代码
2020/01/18 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
写给学生的新学期寄语
2014/01/18 职场文书
军训 自我鉴定
2014/02/03 职场文书
2014年宣传工作总结
2014/11/18 职场文书
就业推荐表导师评语
2014/12/31 职场文书
ktv服务员岗位职责
2015/02/09 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
高一作文之乐趣
2019/11/21 职场文书
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android