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 相关文章推荐
JQuery 图片延迟加载并等比缩放插件
Nov 09 Javascript
JavaScript QueryString解析类代码
Jan 17 Javascript
来自国外的30个基于jquery的Web下拉菜单
Jun 22 Javascript
javascript中onclick(this)用法介绍
Apr 19 Javascript
IE6-8中Date不支持toISOString的修复方法
May 04 Javascript
JavaScript 学习笔记之数据类型
Jan 14 Javascript
JS数组合并push与concat区别分析
Dec 17 Javascript
js 中获取制定的cook信息实现方法
Nov 19 Javascript
JS中的作用域链
Mar 01 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
Apr 10 Javascript
初学vue出现空格警告的原因及其解决方案
Oct 31 Javascript
使用vue实现一个电子签名组件的示例代码
Jan 06 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 采集程序 常用函数
2008/12/18 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
微信小程序实现留言板
2018/10/31 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
Python实现的tab文件操作类分享
2014/11/20 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
python和php哪个容易学
2020/06/19 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
数控个人求职信范文
2014/02/03 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
学校三节实施方案
2014/06/09 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android