JavaScript 对象(一)
2014-05-07 09:06
288 查看
创建对象
通过对象直接量、关键字new和(ECMAScript 5中的)Object.create()函数来创建对象。对象直接量
对象直接量是由若干名/值对组成的映射表,名/值对中间冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。属性名可以是JavaScript标识符也可以是字符串直接量(包括空字符串)。属性的值可以是任意类型的JavaScript表达式,表达式的值(可以是原始值也可以是对象值)就是这个属性的值。在ECMAScript 5(以及 ECMAScript 3的一些实现)中,保留字可以用做不带引号的属性名。然而对于ECMAScript3 laishuo,使用保留字作为属性名必须使用引号引起来。在ECMAScript5中,对象直接量中的最后一个属性后的逗号将忽略,且在ECMAScript 3的大部分实现中也可以忽略这个逗号,但在IE中则报错。
对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象。每次计算对象直接量的时候,也都会计算它的每个属性的值。也就是说,如果在一个重复调用的函数中的循环体内使用了对象直接量,它将创建很多新对象,并且每次创建的对象的属性值也有可能不同。
通过new创建对象
new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数称作构造函数,构造函数用以初始化一个新创建的对象。Object.create()
ECMAScript 5定义了一个名为Object.create()的方法,它创建一个新对象,其中第一个参数是这个对象的原型Object.create()提供第二个可选参数,用以对对象的属性进行进一步描述。Object.create()是一个静态函数,而不是提供给某个对象调用的方法。使用它的方法,只须传入所需的原型对象。
可以通过传入参数null来创建一个没有原型的新对象,但通过这种方式创建的对象不会继承任何东西,甚至不包括基础方法,也就是说,他将不能和“+”运算符一起正常工作。
属性的查询和设置
作为关联数组对象
可以通过电(.)或方括号([])运算符来获取属性的值。使用方括号和一个字符串,看起来更像数组,只是这个数组元素是通过字符串索引而不是数字索引。这种数组就是我们所说的关联数组,也称作散列、映射或字典。JavaScript对象都是关联数组。当通过点运算符(.)访问对象的属性时,属性名用一个标识符来表示。标识符必须直接出现在Javascript程序中,它们不是数据类型,因此程序无法修改它们。
当通过[]来访问对象的属性时,属性名通过字符串来表示。字符串是javascript的数据类型,在程序运行时可以修改和创建它们。
继承
JavaScript对象具有“自由属性”,也有一些属性是从原型对象继承而来的属性访问错误
查询一个不存在的属性并不会报错,属性访问表达式返回undefined。如果对象不存在,那么查询这个不存在的对象的属性就会报错。
在这些场景下给对象o设置属相p会失败:
o中的属性p是只读的:不能给只读属性重新赋值(defineProperty()方法中有一个例外,可以对可配置的只读属性重新赋值)。
o中的属性p是继承属性,且它是只读的:不能通过同名自有属性覆盖只读的继承属性。
o中不存在自有属性p:o没有使用setter方法继承属性p,并且o的可扩展性是false。如果o中不存在p,而且没有setter方法可供调用,则平一定会添加至o中。但如果o不是可扩展的,那么在o中不能定义新属性。
删除属性
delete运算符可以删除对象的属性。它的操作数应当是一个属性访问表达式。delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性。delete运算符只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除它,而且这会影响到所有继承自这个原型的对象)。
当delete表达式删除成功或没有任何副作用(比如删除不存在的属性)时,它返回true。如果delete后不是一个属性访问表达式,delete同样返回true。
delete不能删除那些可配置性为false的属性(尽管可以删除不可扩展对象的可配置属性)。某些内置对象的属性是不可配置的,比如通过变量声明和函数声明创建的全局对象的属性。在严格模式中,删除一个不可配置属性会报一个类型错误。在非严格模式中,在这些情况下的delete操作会返回false。
当在非严格模式中删除全局对象的可配置属性时,可以省略对全局对象的引用,直接在delete操作符后跟随要删除的属性名。
在在严格模式中,delete后跟随一个非法的操作数,则会报一个语法错误,因此必须显示指定对象及其属性。
检测属性
Javascript对象可以看做属性的集合,检测集合中的成员所属关系——判断某个属性是否在某个对象中。可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成,甚至仅通过属性查询也可以。in运算符的左侧属性名(字符串),右侧是对象。如果对象的自有属性或继承属性中包含这个属性则返回true。
对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。对于继承睡醒返回false
propertyIsEnumerable()只有检测到有自由属性且这个属性的可枚举性为true时返回true。某些内置属性是不可枚举的。通常由javascript代码创建的属性都是可枚举的,除非在ECMAScript 5中使用一个特殊的方法来改变属性的可枚举性。
“!==”判断一个属性是否undefined。
in可以区分不存在的属性和存在但值为undefined的属性。
“!==”可以区分undefined和null。
相关文章推荐
- JavaScript中的Location地址对象
- JavaScript的document和window 对象详解
- 把javascript中的json对象传到action的list里的方法
- 【实例】javascript不用标签ID获取标签对象
- JavaScript之 ------ 文档对象模型(DOM)
- javascript 对象Array详解
- Javascript下获取对象引用的两种方法之getElementsByTagName
- JavaScript对象——String
- 笔记:javascript通过反射和遍历,访问对象的所有属性,及 按引用/按值传递
- JavaScript的数据对象有那些属性值?
- 最优化javascript自定义对象
- JavaScript之日期和时间(date对象)
- 公司培训文档-JavaScript[对象.属性]集锦
- JavaScript对象应用-字符串和图片对象
- javascript中对象访问自身属性的方式
- javascript:Location对象的使用简介
- JSP(JavaScript的内部对象)
- Javascript中this对象详解
- 扩展javascript扩展(类,对象,原型)
- cocos2d JS-(JavaScript) 几种循环遍历对象的比较