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 相关文章推荐
javascript 不间断的图片滚动并可点击
Jan 15 Javascript
利用js实现选项卡的特别效果的实例
Mar 03 Javascript
JS小功能(列表页面隔行变色)简单实现
Nov 28 Javascript
JavaScript中toString()方法的使用详解
Jun 05 Javascript
表单验证正则表达式实例代码详解
Nov 09 Javascript
Angular2环境搭建具体操作步骤(推荐)
Aug 04 Javascript
vue webpack打包优化操作技巧
Feb 22 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
使用express来代理服务的方法
Jun 21 Javascript
微信小程序 冒泡事件原理解析
Sep 27 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 Javascript
小程序实现图片预览裁剪插件
Nov 22 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
python利用OpenCV2实现人脸检测
2020/04/16 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
python matlibplot绘制3D图形
2018/07/02 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
python贪吃蛇游戏代码
2020/04/18 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
数据库方面面试题
2012/04/22 面试题
介绍一下write命令
2014/08/10 面试题
2014年小班元旦活动方案
2014/02/16 职场文书
大学生演讲稿
2014/04/25 职场文书
反邪教警示教育方案
2014/05/13 职场文书
三潭印月的导游词
2015/02/12 职场文书
社区党务工作总结2015
2015/05/19 职场文书
婚宴主持词
2015/06/30 职场文书
党课主持词大全
2015/06/30 职场文书
公司宣传语大全
2015/07/13 职场文书
校园新闻稿范文
2015/07/18 职场文书
使用CSS实现音波加载效果
2023/05/07 HTML / CSS