Javascript学习笔记(六)

1.对象的属性

可以通过点号或者方括号运算符来获取属性的值。运算符左侧应该是一个表达式,它返回一个对象。对于点号来说,右侧必须是一个属性名称的简单标识符。对于方括号来说,里面必须是一个结果为字符串的表达式,字符串也是一个属性的名字。

js对象有些属性是从原型对象继承而来,有些是“自有”的。如果要查询对象o的属性x,如果o中不存在x,那么会继续在o的原型对象的属性中查找。如果原型对象也没有x,但是这个原型对象也有原型对象,那么会继续向上查找,直到找到x或者原型对象为null才打止。这样对象的原型属性构成了一个“链”。

查询一个不存在的属性不会报错,会返回undefined。但是如果查询一个不存在属性上的属性,会报错。内置构造函数的原型是只读的,不允许进行修改,但是只在严格模式下才会报错。

delete可以删除掉一个对象中的属性,但它只是断开属性和对象之间的联系,并没有把属性处理掉。delete不能删除那些可配置性为false的属性。

in运算符的左侧是属性名(字符串形式),右侧是对象。如果对象的自有属性或继承属性中包含这个属性,则返回true。对象有hasOwnProperty方法,用于检测某个属性是不是该对象的自有属性,如果属性是继承而来,则返回false。propertyIsEnumerable方法只有检测到某个属性是自有属性且可枚举性为true时,才返回true。

for/in循环可以在循环体中便利对象中的所有可枚举对象,包括自有和继承的属性。对象继承的内置方法不可枚举,但在代码中给对象添加的属性都是可枚举的(除非将它们转换成不可枚举的)。ES5定义了两个函数,一个是Object.keys(),返回一个数组,由对象中可枚举的自有属性的名称组成;另一个是Object.getOwnPropertyNames(),返回对象的所有自有属性的名称,而不仅仅是可枚举的。

在ES5中,属性值可以用一个或两个方法替代,这两个方法就是getter和setter,这种属性叫存储器属性。如果属性同时具有getter/setter方法,那么它是一个读/写属性;如果只有getter方法,那么它是一个只读属性;如果只有setter方法,那么它是一个只写属性,读取只写属性总是返回undefined。

为了实现属性特性的查询和操作,ES5定义了一个名为“属性描述符”的对象。属性描述符对象有四个属性:value(或get),writable(或set),enumerable和configurable,可以用Object.getOwnPropertyDescriptor()函数获取该对象。可以使用Object.defineProperty()修改属性的特性。如果对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新属性。如果属性是不可配置的,则不能修改它的可配置型和可枚举性。如果存储器属性是不可配置的,则不能修改器getter和setter方法,也不能将它转为数据属性。如果数据属性是不可配置的,则不能将它转换成存取器属性。如果数据属性是不可配置的,则不能将它的可写性由false修改为true,但是可以从true修改为false。如果数据属性是不可配置且不可写的,则不能修改它的值,然而可配置但不可写属性的值是可以修改的,可以采用修改value特性的方法来修改属性的值。

每一个对象都有与之相关的原型、类和可扩展性。通过对象直接量创建的对象以Object.prototype作为它们的原型。通过new 创建的对象使用构造函数的prototype属性作为它们的原型。通过Object.create()创建的对象使用第一个参数作为它们的原型。ES5中规定了使用Object.getPrototypeOf()可以查询一个对象的原型,ES3中可以使用o.constructor.prototype来检测一个对象的原型。如果要检测一个对象是否是另外一个对象的原型或者处在原型链中,可以使用isPrototypeOf()方法。

Mozilla、Safari和Chrome都支持__proto__属性,但是IE和Opera支持,因此尽可能不要使用这个属性。

ES5没有规定方法获取一个对象的类名。

对象的可扩展性用以表示是否可以给对象添加新属性。ES5中所有的内置对象和自定义对象都是可扩展的。Object.isExtensible()用于获取一个对象是否可扩展的。Object.preventExtesions()用于将对象转换为不可扩展的,但是只影响对象本身的可扩展性。如果给一个不可扩展的对象原型添加属性,那么不可扩展的对象同样会集成这个新属性。Object.seal()除了能够将对象设置成不可扩展的,还会将对象的所有自有属性都设置为不可配置的。Object.isSealed()检测对象是否封闭。Object.freeze()将冻结一个对象,除了将对象设置成不可扩展和所有属性设置成不可配置的以外,还会将它自有的所有属性设置为只读的(但有setter方法的不受影响)。Object.isFrozen()用于检测对象是否冻结。

ES5提供了内置函数JSON.stringify()用于序列化一个对象,JSON.parse()用来还原一个js对象。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值