JavaScript 对象(一)

创建对象

   通过对象直接量、关键字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。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值