对象

1.如果变量x指向一个对象的引用,那么执行代码var y=x;变量y也是指向同一个对象的引用,而非这个对象的副本。通过变量y修改这个对象亦会对变量x造成影响

2.创建对象:对象直接量、关键字new和Object.create()。
Object.create()创建对象,第一个参数是这个对象的原型,提供第二个可选参数,用对对象的属性进行进一步描述。

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

3.每个属性有一些与之相关的值,成为“属性特性“
可写:表明是否可以设置该属性的值。
可枚举:表明是否可以通过for/in循环返回改属性。
可配置:表明是否可以删除或修改该属性。

4.对象特性
对象的原型:指向另一个对象,本对象的属性继承自它的原型对象。
对象的类:一个标识对象的字符串。
对象的扩展标记:指明了(在ECMAScript 5中)是否可以向该对象添加新属性。

5.原型
所有通过对象直接量创建的对象都具有同一个对象原型,并可以通过JavaScript代码Object.prototype获得对象原型的引用。通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。
因此,同使用{ }创建对象一样,通过new Object()创建的对象也继承自Object.prototype.
通过new Array()创建的对象,原型就是Array.prototype,通过new Date()创建的对象,原型就是Date.prototype.
没有原型的对象为数不多,Object.prototype就是其中之一。所有的内置构造函数都具有一个继承自Object.prototype的原型。

6.删除属性
delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性。
delete运算符只能删除自有属性,不能删除继承属性。

7.检测属性
in运算符的左侧是属性名,右侧是对象。如果对象的自有属性或继承属性中包含这个属性,则返回true:

var o = { x:1 };
"x" in o;       //true
"y" in o;       //false
"toString" in o //true

in 可以区分不存在的属性和存在但值为undefined的属性。

对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性,对于继承属性它将返回false。

propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到是自有属性且这个属性的可枚举性为true时它才返回true。

8.枚举属性
for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承属性)。

除了for/in循环之外,ECMAScript 5定义了两个用以枚举属性名称的函数。第一个是Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成。第二个枚举属性的函数是Object.getOwnPropertyNames(),它和Object.keys()类似,只是它返回对象的所有自有属性名称,而不仅仅是可枚举的属性。

9.getter和setter
由getter和setter定义的属性称作”存取器属性“,存取器属性不具有可写性。

10。属性的特性
数据属性的4个特性:值(value)、可写性(writable)、可枚举性(enumerable)和可配置性(configurable)。
存取器属性的4个特性:读取(get)、写入(set)、可枚举性和可配置性。

11.属性描述符
ECMAScript 5定义了一个名为”属性描述符“的对象,这个对象代表那4个特性。
数据属性的描述符对象的属性有value、writable、enumeralbe和configurable。存取器属性的描述符对象则用get属性和set属性代替value和writable。

通过调用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符:

//返回{value:1,writable:true,enumerable:true,configurable:true}
Object.getOwnPropertyDescriptor({x:1},"x");

Object.getOwnPropertyDescriptor()只能得到自有属性的描述符。

要想设置属性的特性,或者想让新建属性具有某种特性,则需要调用Object.definePeoperty(),传入要修改的对象、要创建或修改的属性的名称以及属性描述符对象:

var o={};//创建一个空对象
//添加一个不可枚举的数据属性x,并赋值为1
Object.defineProperty(o,"x",{ value:1,
                              writable:true,
                              enumerable:false,
                              configurable:true});

如果要同时修改稿或创建多个属性,则需要使用Object.defineProperties().第一个参数是要修改的对象,第二个参数是一个映射表,它包含要新建或修改的属性的名称,以及它们的属性描述符:

var p = Object.defineProperties({},{
  x:{value:1,writable:true,enumerable:true,configurable:true},
  y:{value:1,writable:true,enumerable:true,configurable:true},
  r:{
      get:function(){return Math.sqrt(this.x*this.x+this.y+this.y)},
      enumerable:true,
      configurable:true
      }
});

12.原型属性
在ECMAScript 5中,将对象作为参数传入Object.getProtorypeOf()可以查询它的原型。
要想检测一个对象是否是另一个对象的原型,用isPrototypeOf()方法。
通过p.isPrototypeOf(o)来检测p是否是o的原型。

13.ECMAScript 5定义了用来查询和设置对象可扩展性的函数。通过将对象传入Objcet.esExtensible(),来判断该对象是否是可扩展的。
如果将对象转换为不可扩展的,需要调用Object.preventExtensions(),将待转换的对象作为参数传进去。

Object.seal()和Object.preventExtensions()类似,除了能将对象设置为不可扩展的,还可以将对象的所有自有属性都设置为不可配置的。可以使用Object.isSealed()来检测对象是否封闭。

Object.freeze()将更严格地锁定对象——”冻结”。除了将对象设置为不可扩展的和将其属性设置为不可配置的之外,还可以将它自有的所有数据属性设置为只读。使用Object.isFrozen()来检测对象是否冻结。

14.序列化对象
对象序列化是指将对象的状态转换为字符串,也可将字符串还原为对象。
ECMAScript 5提供了内置函数JSON.stringify()和JSON.parse()用来序列化和还原JavaScript对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值