源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-09-22 12:51 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:JS模拟面向对象全解(二、类型与赋值)
类型赋值类似变量传递的问题。 基本数据类型不必说,传值的。
[u]复制代码[/u] 代码如下:
var a=5; var b=a; b=3; alert(a);//提示5 alert(b);//提示3
由此观之,发现改变b不会改变a,因为都是变量的值在来回传递,和变量本身没有关系。 对象类型,传址的。
[u]复制代码[/u] 代码如下:
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,互相改变。 如若还不清楚,再举个例子:
[u]复制代码[/u] 代码如下:
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
不过,对象类型的属性互相赋值,就与对象类型没关系了,就和其属性的类型有关系。 属性是基本数据类型则传值,属性是对象类型则传址。举个例子吧,简单点:
[u]复制代码[/u] 代码如下:
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
上面来回赋值的不过是两个不同对象的属性,都是互相孤立的,也都是基本数据类型,因此只是互相传值,不会互相影响。
[u]复制代码[/u] 代码如下:
var a=new Object(); a.x=5; var b=a.x; b=3; alert(a.x);/提示/5 alert(b);//提示3
这也是一样,b这个基本数据类型与a的基本数据类型的属性x相互赋值,同样不会互相影响,只是互相传值。 可是,对象的属性如果也是对象类型,那就也是传址了。
[u]复制代码[/u] 代码如下:
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时,他们就是互通的了,其实就是同一个了,可以互相影响、改变。 ———— 可是,如果我想让对象类型变量赋值时,只是拷贝属性,而不是达到“你就是我,我就是你”的境界、“同生共死”的高尚品格。怎么办? 木有什么特别好的办法,用下面这个函数吧。
[u]复制代码[/u] 代码如下:
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; }
用法
[u]复制代码[/u] 代码如下:
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对象。
[u]复制代码[/u] 代码如下:
function change(a) { a[0]=5; alert(a);//提示5 } var x=[3]; alert(x);//提示3 change(x); alert(x);//提示5
赋值为一个[xx],其实就是赋值为一个有数据的Array对象。这里就是利用含有一个元素的数组来模拟传址。因为数组是对象类型,传递时传址。 当然,你也可以用任意对象类型的属性来模拟。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部