关于javascript对象的认识详解

十二、对象

1、创建对象

1)直接量创建对象即

var point = {x:1,y:1};对于变量的最后一个属性的逗号可以省略,但是在IE浏览器中还是会报错,直接量对象是一个表达式,每次运算都会创建并初始化一个新的对象。

(2)通过new创建一个对象

New运算符创建并初始化一个新对象

(3)原型

每个js对象(null除外)都会和另一个对象相关联,另一个对象就是原型。没有原型的对象位数不多,但是object.prototype就是。

(4)object.create方法

他会创建一个新的对象,其中第一个参数就是这个对象的原型,第二个参数是可选的参数,用于对对象属性的进一步描述,想要创建一个控对象可以传入objectPrototype,如果传入了null,就会创建一个没有原型的对象,一些基础的方法也不会包括。

2、属性的查询和设置

(1)有两种形式,如下

Book.edition

Book[“edition”]

点运算符后面的标识符不能是保留字,比如for或者class之类的,但是可以用方括号的形式去访问他们,在ECMAScript中可以用点访问了;

也就是说标识符是静态的,必须死写在程序中,但是[]运算符,使用的是字符串,字符串的数值是动态的,可以在运行的时候修改,不是标识符;

(2)作为关联数组的对象

只是这个数组元素的索引并不是数字,而是字符串索引。这种数组就是我们所说的关联数组,也称作是三列或者映射或者字典。Js的对象都是关联数组。

(3)继承

Js对象具有自有属性和继承属性;属性赋值操作首先会检查原型链,依此判定是否允许赋值操作。

js中只有查询的时候才会体会到继承的存在,而设置属性则和继承无关。属性的赋值,要么失败,要么创建一个新的属性,要么在原始对象中设置属性。但是如果对象的继承属性是一个存储器属性,那么用setter调用该属性,并不是给该对象创建一个新的属性。

(4)属性访问错误

查询一个不存在的属性不会报错,而是会返回undefined,但是从一个不存在的对象中查询属性,那么会报错,因为不存在的属性为null或者是undefined数值,但是他们两个是没有属性的。

有一些属性是不可以被赋值的,还有一些对象不可以被添加新的数值,这些都是不会报错的,只是不做任何的操作而已。但是在ECMAScript5中已经修复,任何失败的属性操作都会抛出一个类型错误异常;

以下情况下操作会失败:

O中的属性p是只读的,不能给只读的属性赋值(defineProperty方法例外)

O中的继承属性p是只读的,不能通过同名自有的属性覆盖只读的属性

O中不存在自有属性po没有使用setter方法继承p,并且o的可扩展性是false。如果o中不存在p的话,而且没有setter方法可供调用,那么p一定会添加到o中;

3、删除属性

(1)delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性;Delete运算符只能删除自有属性,不能删除继承属性;当delete表达式删除成功或者没有其他的任何副作用的时候会返回true;如果delete后面是一个非法的表达式的时候,delete也会返回truedelete不能删除那些可配置性为false的属性,某些内置对象的属性是不可以配置的,比如通过变量声明和函数声明创建的全局对象的属性。也就是varfunction全局函数。Delete x这种写法会报一个语法错误,delete后面的参数一定是显示的指定其对象和属性的;

4、检测属性

(1)in运算法,”x” in o 也就是xo的自身属性或者是继承属性,就会返回true

(2)hasOwnProperty()函数o.hasOwnProperty(“x”)方法用来检测给定名字是否为对象的自有属性,对于继承属性会返回false

(3)propertyIsEnumerable()hasOwnProperty()函数的增强版,确定这个属性是自身属性并且是可以枚举的

(4)当然用o.x !== undefined也可以实现in的判断,但是不能识别,数值本森为undefined的属性

5、枚举属性

(1)对象继承的内置方法都是不可以枚举的,但是在代码中给对象的添加的属性都是可枚举的;

(2)ECMAScript5定义了两个用以枚举属性名称的函数;第一个是object.keys(),返回一个数组;第二个是object.getOwnPropertyNames(),他返回的是所有自有属性的名称,但是不仅仅是可枚举的属性;

6、GetterSetter

ECMAScript5规定,属性值可以用一个或者两个方法来代替,这两个方法就是gettersetter方法,叫做存储器属性;

7、属性的特性

ECMAScript5中出现了对属性的特性的api,可以对这些属性进行配置。

用法:

将原型对象添加的方法设置成为不可以枚举的,这样子让他们看起来更加像内置的方法。

可以通过这些API给对象定义不能修改或者删除的属性用来锁定这个对象。

数据属性的4个特征分别是他的数值value、可写性writable、可枚举性enumerable和可配置性configurable。;

存取器属性没有valuewritable,他们的可写性由setter方法的存在与否决定,因此他的四个特性分别是gettersetterenumerable、和configurable

调用object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述数值;对于继承属性和不存在的属性会返回undefined,也就是说这个方法只能判断自身属性,该方法具有两个属性,第一个是对象,第二个要查询的对象中的数值;想要获取继承属性可以通过getPropertyOf()方法获取原型;

defineProperty()方法可以设置属性的特性,第一个参数是对象,第二个参数是要设置的对象中的属性,第三个参数是一个{}对象,里面是设置的具体数值;这个方法是不可以修改继承属性的,另外可以配置多个属性的方法是defineProperties(),第一个参数是对象,第二个参数是{}对象,里面用x:{},的形式进行定义,其中x为对象中的属性或者为对象新添加的属性,对不允许修改的属性来说,以上两个参数会报错类型异常。

下面是报错的情况:

对于不可以扩展的对象只能修改属性,不能添加新的属性;

如果对象的属性是不可以配置的,则不能修改他的可枚举性和可配置性,不可以将其改编成存取器属性,可以将其可写性从ture改成false,反过来不可以。

如果存取器属性是不可以配置的那么不能修改gettersetter方法,也不能将它转换为数据属性;

可配置但是不可写的属性值是可以修改属性值的

8、对象的三个属性

(1)Property

getPropertyOf();isPropertyOf()==instanceof非常类似,前者是对象,后者直接是Property

(2)类属性

对象的类属性是一个字符串;classOf(x);直接返回x的类名

(3)可扩展性,将对象传入object.esExtensible()来判断对象是不是可扩展的;可以将object.preventExtensions(),可以将对象变为不可扩展的,一旦转换就无法转换回来了,这个方法只会影响对象的不可扩展性,但是如果给对象的原型添加一个方法,这个对象依然可以继承。

(4)Object.seal()方法,除了可以将对象本身设置为不可扩展的,同时对象的属性也变成了不可配置的,但是他的已有可写的属性依然可以设置。可以用object.isSealed()来检测对象是否是封闭的。

(5)Object.freeze()将更严格的多顶对象,将对象设置为不可扩展的同时,其属性为不可以配置,并且都为只读,但是具有setter属性的存取器属性来说,这个变化没有什么影响。可以用object.isfrozen()来判断是否冻结;

(6)上面的方法中都返回传入的对象。

9、序列化对象

对象的序列化指的是将对象的状态转换为字符串,也可以将字符串还原为对象;

ECMAScript5中有JSON.stringify()JSON.parse()方法,来序列化和还原js对象。

在序列化中NANinfinity-infinity都是null,日期对象序列化的结果是ISO格式的日期字符串,JSON.parse依然保持其字符串形态,而不会将他们还原为日期对象;函数、regexp对象、error对象和undefined的值都是不可以序列化和还原的.

JSON.stringify()只能还原可枚举的自有属性;

10、对象的方法

hasOwnProperty()propertyEnumerable()isPropertyOf()这三个方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值