您的位置:首页 > Web前端 > JavaScript

对象

2015-11-09 00:01 225 查看
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对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 javascript