jsobject(对象)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

jsobject(对象)

Object(对象)是在所有的编程语⾔中都⼗分重要的⼀个概念,对于事物我们可以把他们看作是⼀个对象,⽽每⼀个事物都有⾃⼰的表⽰的属性和对于某⼀信息作出的相应的操作。⽽这些东西就变成了事物的属性和⽅法。

在JS中我们可以见到的对象常量有如下的形式:

1 var obj= {

2

3 name:"Arvin",

4

5 lastName:"Huang" ,

6

7 whatsName:function(){

8

9 alert(+" "+stName);

10

11 },

12

13 }

由上⾯的代码我们可以看出实际上在JS中的对象就是⼀个以键值对形式存储属性的⼀个集合,每⼀个属性有⼀个特定的名称,并与名称相对应的值。其实这种关系是有⼀个专有名称的,我们可以称之为映射,当然对于对象来说,除了可以通过这种⽅式来保持⾃有属性,还可以通过继承的⽅式来获取继承属性。这种⽅式我们称作“原型式继承”。

接下来我们将从js对象的属性,属性特性,⽅法和对象特性等多个⽅⾯来学习对象的概念。

⼀:js对象创建与对对象属性。

我们先看如下的代码。

1 var built = function(){

2

3 var me = this;

4 = "Arvin";

5

6 }

7

8 built.prototype = {

9 toStr:function(value){

10 alert("there have a " + value);

11 }

12

13 };

14

15 var obj = new built();

上⾯的代码就描述了⼀种我们常常使⽤到的⼀种创建对象的⽅法,使⽤new关键字来创建⼀个拥有独⽴内存区域和指向原型的指针的对象。当我们使⽤的new的时候,js解析器会分配⼀块内存空间,⽤以存放当前的对象的⾃有属性。之后解析器会给这⼀对象⼀个_proto_属性指向的原型对象内容。

还有⼀种⽅式我们称之为对象直接量申明的⽅式,代码如下:

1 var obj = {

2

3 name:"Arvin",

4

5 toStr:function(value){

6 alert("there has a "+value);

7 }

8 };

对象直接量就是直接通过花括号包裹的键值对的形式来定义当前对象的。每两个值之间的通过逗号来进⾏分割。键和值之间通过冒号来分割。放解析器读取到当前的内容的时候会⾃动的⽣成⼀个对象的内容并把当前的对象存储在当前上下⽂中。

还有⼀种对象创建的⽅式是使⽤Object.create()⽅法,这⼀⽅法是ECMAScript5中定义的⼀个内容,它是⼀个静态⽅法,其使⽤⽅法如下。

1 var obj = Object.create({x:1,y:2});//obj继承了属性x和y

这⼀⽅法传⼊的参数是⼀个对象,并且这⼀作⽤的对象将会作为新的对象的原型存在。

接下来我们来看⼀看属性。

当我们在chrome的命令台中运⾏第⼀段⽰例代码的时候我们可以看到如下的内容。

可见,当我们在构造函数中直接使⽤this指针(指代当前的对象)添加属性,这时,其实我们的设置的属性是当前的对象特有的属性,独属于当前的对象的,这样的属性称之为⾃有属性。⽽在我们定义构造函数的时候,我们为构造函数的prototype属性(指向原型对象),这时我们定义了prototype的内容和⽅法。当使⽤new关键字来进⾏对象的构造的时候,我们所构造的对象实际上是继承了这⼀原型对象的内容的,所以我们可以再对象的_proto_属性中可以看见继承与原型对象的内容,但这也是属于当前的对象的,(原型链内容请阅读原型链学习汇总。)这样的属性我们称之为继承属性。

我们对象属性的类型可以是字符串,数字,true,false,null和undefined,或者是对象的内容。当然虽然字符串,数字,和布尔值虽然不是对象,但是性质和不可变对象类似的。

我们之前说过属性的值是名字和值,其中名字是可以是包括空字符串在内的任意字符串,但是属性的值是除这些之外的,还可以是定义好的存取器⽅法。如下代码:

1 var o = {

2 x:1,

3 y:1,4

5 get r(){return x+y;},

6 set r(value){this.x = value;}

7 }

如上代码可见,在对象O中r就是⼀个存取器属性内容,存取器属性其实是不可设置的属性的⼀种,只有当他拥有了getter⽅法的时候才可以取值的,⽽⼜setter⽅法的时候表⽰这⼀属性是可写的,存取其属性实在ECMAScript5中才有定义的,实际上是把属性通过函数的⽅式进⾏与外界的数据交互的。从⽽使得属性值本⾝不可以直接进⾏配置或是获取。

存取器属性的写法就如上⾯代码书写的⼀样,get关键字空格之后跟属性名称作为函数的名称,set⽅法和get⽅法是⼀样编写的,只是会传⼊参数,并且参数的个数严格是⼀个,否则会报语法错误。在使⽤的时候我们是通过o.r来调⽤getter⽅法,⽽setter⽅法的调⽤时如下,o.r = 2;

当我们没有定义setter⽅法的时候,使⽤对象调⽤setter⽅法的时候虽然不会报出错误,但是对象中没有任何变化。⽽当我们在定义对象的时候没有定义getter⽅法的时候,在我们调⽤这⼀属性的时候,将会得到undefined。

⼆:js对象属性操作

1.访问属性。

对象属性的访问⼀般是通过obj.attr的⽅式来访问的,或者是obj[attr]的⽅式来进⾏操作,⼀般情况之下这样都是可以⾏的通的,但是但我们的是属性名称是⼀些特殊字段的额时候就要注意了,例如关键字或是保留字段,这是后我们要通过中括号的形式来访问才可以成功,当然这点在ECMAScript5中的已经更改了,但是在我们平常编写的时候还是要注意变量的命名。对于保留字段尽量不要使⽤。

属性访问的时候,当对象存在⽽对象中没有这⼀属性的时候,如果程序中访问了当前的属性的话我们,js的解析器将会返回undefined的数值,但是如果当前需要访问的对象是不存在的,这个时候js就会返回⼀个类型错误。

2.属性赋值。

我们可以通过赋值运算来为属性中可写的属性赋值,当访问的对象存在,但是表达式中的属性不存在时候,则会返回⼀个类型错误。如下

1 var obj = {

2

3 = "Arvin";

4

5 };

相关文档
最新文档