最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-27 20:59:51
文档

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

JS模拟面向对象全解(二、类型与赋值)_javascript技巧:类型赋值类似变量传递的问题。 基本数据类型不必说,传值的。 代码如下: var a=5; var b=a; b=3; alert(a);//提示5 alert(b);//提示3 由此观之,发现改变b不会改变a,因为都是变量的值在来回传递,和变量本身没有关系。 对象类型,传址的。 代码如下:
推荐度:
导读JS模拟面向对象全解(二、类型与赋值)_javascript技巧:类型赋值类似变量传递的问题。 基本数据类型不必说,传值的。 代码如下: var a=5; var b=a; b=3; alert(a);//提示5 alert(b);//提示3 由此观之,发现改变b不会改变a,因为都是变量的值在来回传递,和变量本身没有关系。 对象类型,传址的。 代码如下:


类型赋值类似变量传递的问题。
基本数据类型不必说,传值的。
代码如下:
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对象。这里就是利用含有一个元素的数组来模拟传址。因为数组是对象类型,传递时传址。
当然,你也可以用任意对象类型的属性来模拟。

文档

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

JS模拟面向对象全解(二、类型与赋值)_javascript技巧:类型赋值类似变量传递的问题。 基本数据类型不必说,传值的。 代码如下: var a=5; var b=a; b=3; alert(a);//提示5 alert(b);//提示3 由此观之,发现改变b不会改变a,因为都是变量的值在来回传递,和变量本身没有关系。 对象类型,传址的。 代码如下:
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top