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

类型赋值类似变量传递的问题。
基本数据类型不必说,传值的。


代码如下:

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对象。这里就是利用含有一个元素的数组来模拟传址。因为数组是对象类型,传递时传址。
当然,你也可以用任意对象类型的属性来模拟。

(0)

相关推荐

  • 浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号

    1 C,C++,Java,PHP都能容忍末尾的逗号 C,C++,Java中对数组赋值时,最后一个元素末尾的逗号可有可无.下面两行代码对这些语言来说是等效的. int a[] = {1,2,3}; /* 正确 */ int a[] = {1,2,3,}; /* 正确 */ PHP这一点也继承了C的特点,下面的两行代码等效. $a = array(1,2,3); /* 正确 */ $a = array(1,2,3,); /* 正确 */ 2 JavaScript视末尾逗号为语法错误! 然而到了Jav

  • javascript原始值和对象引用实例分析

    本文实例讲述了javascript原始值和对象引用的方法.分享给大家供大家参考.具体分析如下: 一句话来说:原始值是不可变的,而对象引用是可变的. js中的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着本质的区别.原始值是不可更改的,任何方法都无法更改一个原始值:对于字符串来说,字符串中所有的方法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串值: var str="hello world"; s.toUpperCase(); s;

  • JavaScript数组对象赋值用法实例

    本文实例讲述了JavaScript数组对象赋值用法.分享给大家供大家参考.具体如下: 这里JavaScript数组对象的使用会使你的JS程序变得简洁而有效率,但是好像不少新手都不喜欢用数组,因为觉得它们抽象,不好理解,其实只要你认真领悟,它就像捅破窗户纸一样,令你豁然开朗.希望通过本实例,你对数组会有更多的理解. 运行效果图如下: 具体代码如下: <html> <head> <meta http-equiv="content-type" content=&

  • JavaScript对象引用与赋值实例详解

    本文实例讲述了JavaScript对象引用与赋值.分享给大家供大家参考,具体如下: <script type="text/javascript"> //例子一: 引用 var myArrayRef = new Array(0,1,2); //创建数组对象 var mySeconArrayRef = myArrayRef; // 对象复制. myArrayRef[0] = 100; // 修改元素值 alert(mySeconArrayRef[0]); /** * 输出 10

  • javascript引用对象的方法代码

    同一页面内的引用方法: 1.使用id: link1.href 2.使用name: document.all.link1.href 3.使用sourseIndex: document.all(4).href //注意,前面还有HTML.HEAD.TITLE和BODY,所以是4 4.使用链接集合: document.anchors(0).href //全部的集合有all.anchors.applets.areas.attributes.behaviorUrns.bookmarks. boundEle

  • javascript引用对象的方法

    <a id="link1" name="link1" href="http://bbs.51js.com/">51js</a> ============= 同一页面内的引用方法: 1.使用id: link1.href 2.使用name: document.all.link1.href 3.使用sourseIndex: document.all(4).href //注意,前面还有HTML.HEAD.TITLE和BODY,所以

  • JavaScript 类的定义和引用 JavaScript高级培训 自定义对象

    一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascript中,已经存在一些标准的类,例如Date.Array.RegExp.String.Math.Number等等,这为我们编程提供了许多方便.但对于复杂的客户端程序而言,这些还远远不够. 与Java不同,Java2提供给我们的标准类很多,基本上满足了我们的编程需求,但是Javascript提供的标准类很

  • JavaScript对象参数的引用传递

    今天碰到一个问题,怎样把参数变更影响到函数外部,如: <script> var myname = "wood"; A(myname); document.write(myname); function A(n) { n = "Yao"; } </script> 输出结果还是wood,说明当myname传入A函数后,在函数体内,相当于有一个myname的副本,这个副本的值等于myname,之后在函数体内对其做的操作是在这个副本上进行的. 但情况

  • js中判断Object、Array、Function等引用类型对象是否相等

    在迭代中,我们还要注意的是,对象或者数组中的元素可能是一个任意值--除了原始类型值.object.arrray外,这个值还可能是一个方法.一个DOM对象或者window对象,可能你已经注意到了,有部分引用类型是不能进行迭代的,需要分支判断,代码如下: 复制代码 代码如下: function compare(a,b){ var pt = /undefined|number|string|boolean/, fn = /^(function\s*)(\w*\b)/, cr = "constructo

  • Javascript delete 引用类型对象

    如下面例子: 复制代码 代码如下: var testVar = {            a : {                test : 1            }        },            test1 = {},            test2 = {}; test1.a = testVar.a;        test2.a = testVar.a;/*        delete test1.a;        console.log(test1.a); //

随机推荐