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 相关文章推荐
Node.js中对通用模块的封装方法
Jun 06 Javascript
javascript图片预加载实例分析
Jul 16 Javascript
JavaScript实现广告弹窗效果
Aug 09 Javascript
canvas的神奇用法
Feb 03 Javascript
ES6中Symbol类型用法实例详解
Apr 06 Javascript
jquery实现用户登陆界面(示例讲解)
Sep 06 jQuery
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
Sep 26 Javascript
实时监控input框,实现输入框与下拉框联动的实例
Jan 23 Javascript
基于vue展开收起动画的示例代码
Jul 05 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
Mar 03 Javascript
JS深入学习之数组对象排序操作示例
May 01 Javascript
js实现全选和全不选功能
Jul 28 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
用PHP实现的生成静态HTML速度快类库
2007/03/31 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
Python实现测试磁盘性能的方法
2015/03/12 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
python实现桌面气泡提示功能
2019/07/29 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
python如何使用腾讯云发送短信
2020/09/17 Python
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
机械设计制造专业个人求职信
2013/09/25 职场文书
求职信格式范本
2013/11/15 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
教师节倡议书
2014/08/30 职场文书
农村婚庆主持词
2015/06/29 职场文书