JavaScript面向对象编程之对象的属性

对象的定义

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 propertyaccessor 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最近所学总结,欢迎转载,但请注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值