对象的定义
JavaScript中的对象究竟是什么意思呢?ECMA-262将object定义为无序属性的集合,其属性可以包含基本值、对象或函数(相当于是一组没有特定顺序的值,类似于散列表)。下面让我们细细来看JavaScript中的对象。
理解对象
创建对象的最简单例子就是创建一个Object的实例:
var person = new Object();
person.name = "bruce";
person.sayName = function () {alert(this.name);};
渐渐地,对象字面量成为创建这种对象的首选方式:
var person = {
name:"bruce",
sayName: function(){alert(this.name);}
}
我们可能会问对象的属性是类似于物理学中不可分割的基本单位吗?显然不是。对象的属性在创建时会带有一些特征值(characteristic),JS用这些特征值来定义它们的行为。
属性的分类
ECMA-262 fifth edition 定义在内部才能用的attribute,描述property(为了实现JS引擎),因此在JS中不能直接访问它们。比如[[Enumerable]]。
ECMAScript中有两种属性:Data property 和 accessor property。
Data property
数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有 4 个描述其行为的特性。
- [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为 true。
- [[Enumerable]]:表示能否通过 for-in 循环返回属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为 true。
- [[Writable]]:表示能否修改属性的值。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为 true。
- [[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。这个特性的默认值为 undefined。
如果想要修改property的attribute,可以使用ECMAScript5的Object.defineProperty()方法。
值的注意的是,一旦把属性定义为不可配置,就不能修改回来为可配置了。
accessor property
访问器属性不包含数据值,包含一对getter和setter方法(但不是必须的),读取accessor property,调用getter方法,写入时,调用setter方法。
- [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。
- [[Enumerable]]:表示能否通过 for-in 循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为 true。
- [[Get]]:在读取属性时调用的函数。默认值为 undefined。
- [[Set]]:在写入属性时调用的函数。默认值为 undefined。
那么访问器属性如何来定义呢?
访问器属性不能够直接定义,需要使用Object.defineProperty()方法来定义:
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); //2
我们在属性前面加_,表示只能通过对象方法访问的属性。我们使用accessor property的常见方式就是设置一个属性的值会导致其他属性的值发生变化。
定义多个属性
我们可以通过Object.defineProperties( )同时定义多个属性(具体可以看官方文档或Google).
读取属性的特性(attribute)
使用 ECMAScript 5 的 Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。这个方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。返回值是一个对象,如果是访问器属性,这个对象的属性有 configurable、 enumerable、 get 和 set;如果是数据属性,这个对象的属性有 configurable、 enumerable、 writable 和 value。
本文原创发表于CSDN,为BruceYuj最近所学总结,欢迎转载,但请注明出处