JS模拟面向对象全解(二、类型与赋值)


Posted in Javascript onJuly 13, 2011

类型赋值类似变量传递的问题。
基本数据类型不必说,传值的。

var a=5; 
var b=a; 
b=3; 
alert(a);//提示5 
alert(b);//提示3

由此观之,发现改变b不会改变a,因为都是变量的值在来回传递,和变量本身没有关系。
对象类型,传址的。
var a=new Object(); 
a.x=5; 
var b=a; 
b.x=3; 
alert(a.x);//提示3 
alert(b.x);//提示3

这样,由于传址,所以b即是a,a即是b,互相改变。
如若还不清楚,再举个例子:
var a=new Object(); 
a.x=5; 
var b=a; 
alert(b.x);//提示5,b.x即a.x,都是5 
a.x=3;//改a.x即改b.x,都是3了 
alert(a.x);//提示3 
alert(b.x);//提示3

不过,对象类型的属性互相赋值,就与对象类型没关系了,就和其属性的类型有关系。
属性是基本数据类型则传值,属性是对象类型则传址。举个例子吧,简单点:
var a=new Object(); 
a.x=5; var b=new Object(); 
b.x=a.x; b.x=3; 
alert(a.x);//提示5 
alert(b.x);//提示3

上面来回赋值的不过是两个不同对象的属性,都是互相孤立的,也都是基本数据类型,因此只是互相传值,不会互相影响。
var a=new Object(); 
a.x=5; 
var b=a.x; 
b=3; 
alert(a.x);/提示/5 
alert(b);//提示3

这也是一样,b这个基本数据类型与a的基本数据类型的属性x相互赋值,同样不会互相影响,只是互相传值。
可是,对象的属性如果也是对象类型,那就也是传址了。
var a=new Object(); 
a.x=new Object; 
a.x.n=5; 
var b=a.x; 
alert(b.n);//提示5 
b.n=3;//也就改了a.x的n 
alert(a.x.n);//提示3 
alert(b.n);//提示3

a对象的属性x,被定义为一个Object对象类型。因此b赋值为a.x时,他们就是互通的了,其实就是同一个了,可以互相影响、改变。
————
可是,如果我想让对象类型变量赋值时,只是拷贝属性,而不是达到“你就是我,我就是你”的境界、“同生共死”的高尚品格。怎么办?
木有什么特别好的办法,用下面这个函数吧。
var DeepCopy = function(destination, source) 
{ 
for (var property in source) 
{ 
var copy = source[property]; 
if ( destination === copy ) continue; 
if ( typeof copy === "object" ) 



{ 
destination[property] = DeepCopy(destination[property] || {}, copy); 
  } 



 else 



 { 

 destination[property] = copy; 

 } 
} 
return destination; 
}

用法
var a=new Object; 
a.x=5; 
a.y=3; 
var b=new Object; 
DeepCopy(b,a); 
alert(b.x);//提示5 
alert(b.y);//提示3 
b.x=8; 
alert(a.x);//提示5

看,修改了b.x却不能影响a.x了吧?
这个DeepCopy是个不错的函数。
上面实现了对象类型的模拟“传值”
那么怎么做才能模拟基本数据类型的“传址”?
就是用Array对象。
function change(a) 
{ 
a[0]=5; 
alert(a);//提示5 
} 
var x=[3]; 
alert(x);//提示3 
change(x); 
alert(x);//提示5

赋值为一个[xx],其实就是赋值为一个有数据的Array对象。这里就是利用含有一个元素的数组来模拟传址。因为数组是对象类型,传递时传址。
当然,你也可以用任意对象类型的属性来模拟。
Javascript 相关文章推荐
JSON 和 JavaScript eval使用说明
Jun 13 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
Jan 02 Javascript
jQuery中:password选择器用法实例
Jan 03 Javascript
JavaScript声明变量名的语法规则
Jul 10 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
Nov 17 Javascript
JQuery的Pager分页器实现代码
May 03 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
May 30 Javascript
详解angularjs中如何实现控制器和指令之间交互
May 31 Javascript
vue-scroller记录滚动位置的示例代码
Jan 17 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
Oct 21 Javascript
JavaScript实现图片轮播特效
Oct 23 Javascript
JS模拟面向对象全解(一、类型及传递)
Jul 13 #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
You might like
Protoss热键控制
2020/03/14 星际争霸
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
PHP 反向排序和随机排序代码
2010/06/30 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
js匿名函数使用&传参(实例)
2017/09/08 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
python使用多进程的实例详解
2018/09/19 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
医院义诊活动总结
2014/07/04 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
 python中的元类metaclass详情
2022/05/30 Python
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers