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学习笔记之jQuery选择器的使用
Dec 22 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
Dec 14 Javascript
调用DOM对象的focus使文本框获得焦点
Feb 19 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
Nov 23 Javascript
js正则匹配出所有图片及图片地址src的方法
Jun 08 Javascript
Windows系统下Node.js的简单入门教程
Jun 23 Javascript
小议JavaScript中Generator和Iterator的使用
Jul 29 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
Feb 08 Javascript
微信小程序实现时间预约功能
Nov 27 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 Javascript
Vue的全局过滤器和私有过滤器的实现
Apr 20 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 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字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
TBCompressor js代码压缩
2011/01/05 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
Json解析的方法小结
2016/06/22 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
2016/12/01 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
python实现发送和获取手机短信验证码
2016/01/15 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
Python第三方库的安装方法总结
2016/06/06 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
tensorflow如何批量读取图片
2019/08/29 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
python简单实现9宫格图片实例
2020/09/03 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
HTML5新增的Css选择器、伪类介绍
2013/08/07 HTML / CSS
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
财务副总经理工作职责
2013/11/25 职场文书
综合实践活动总结
2014/05/05 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android