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 相关文章推荐
基于jquery的jqDnR拖拽溢出的修改
Feb 12 Javascript
使用javascipt---实现二分查找法
Apr 10 Javascript
jquery实现checkbox全选全不选的简单实例
Dec 31 Javascript
基于JS实现PHP的sprintf函数实例
Nov 14 Javascript
详解Bootstrap四种图片样式
Jan 04 Javascript
JavaScript中Form表单技术汇总(推荐)
Jun 26 Javascript
PHP抓取HTTPS内容和错误处理的方法
Sep 30 Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 Javascript
JS 调试中常见的报错问题解决方法
May 20 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
Jun 13 Javascript
解决layui页面按钮点击无反应,也不报错的问题
Sep 29 Javascript
vue解决使用$http获取数据时报错的问题
Oct 30 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读取xml实例代码
2010/01/28 PHP
PHP flock 文件锁详细介绍
2012/12/29 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
python使用循环实现批量创建文件夹示例
2014/03/25 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
Pygame的程序开始示例代码
2020/05/07 Python
python初步实现word2vec操作
2020/06/09 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
好的自荐信的要求
2013/10/30 职场文书
季度思想汇报
2014/01/01 职场文书
体育之星事迹材料
2014/05/11 职场文书
英文道歉信
2015/01/20 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书