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 设计模式 富有表现力的Javascript(一)
May 26 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
Sep 02 Javascript
IE、FF浏览器下修改标签透明度
Jan 28 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
Dec 31 Javascript
jquery if条件语句的写法
May 19 Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 Javascript
Ubuntu系统下Angularjs开发环境安装
Sep 01 Javascript
使用JavaScript中的lodash编写双色球效果
Jun 24 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
Nov 25 Javascript
JS事件流与事件处理程序实例分析
Aug 16 Javascript
VUE路由动态加载实例代码讲解
Aug 26 Javascript
layer.alert自定义关闭回调事件的方法
Sep 27 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
第七章 php自定义函数实现代码
2011/12/30 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
php无序树实现方法
2015/07/28 PHP
php并发加锁示例
2016/10/17 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
2016/12/01 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
简单介绍Python中的round()方法
2015/05/15 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
EJB与JAVA BEAN的区别
2016/08/29 面试题
业务主管岗位职责
2013/11/20 职场文书
统计岗位职责
2014/02/21 职场文书
大学生活自我评价
2014/04/09 职场文书
清明节演讲稿
2014/05/27 职场文书
大型演出策划方案
2014/05/28 职场文书
公证委托书格式
2014/09/13 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
就业导师推荐信范文
2015/03/27 职场文书
公司老总年会致辞
2015/07/30 职场文书
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL