面向对象的程序设计——理解对象
面向对象的程序设计
ECMA-262 把对象定义为:无须属性的集合,其属性可以包含基本值、对象或者函数。
理解对象
var person = new Object(); //创建对象
person.name = "Nicholas"; //添加属性
person.age = 29;
person.job = "teacher";
person.sayName = function(){ //添加方法,this 表示当前作用域下的对象;this 表示new Objecy() 实例化出来的那个对象;this 要放在一个作用域下,比如person.sayName()是person 下的方法,方法可用this 表示方法本身。
alert(this.name);
};
属性类型
ECMAScript 中有两种属性:数据属性和访问器属性,它们不能在JavaScript 中直接访问,规范把它们放在了两对[[]]中间,如:[[Enumerable]]。
数据属性
数据属性是包含一个数据值的属性,在这个位置可以读取和写入值。4个特性
[[Configurable]]
:表示能否通过delete
删除属性、能否修改属性的特性,能否把属性修改为访问器属性。默认true
。
[[Enumerable]
:表示能通过for-in
循环返回属性。默认true
。
[[Writable]]
:表示能否修改属性值。默认true
。
[[Value]]
:包含这个属性的数据值。默认undefined
。
例:
var person = {
name: "Nicholas" //[[Value]]的特性将这里设置为"Nicholas",对这个值的任何修改都讲反应在这里。
};
要修改默认特性,要使用Object.defineProperty()
方法。接收三个参数:属性所在的对象,属性的名字和一个描述符对象。描述符对象必须是configurable
,enumerable
,writable
,value
。
例:
var person = {};
Object.defineProperty(person,"name",{ //person:属性所在的对象;name:属性名;花括号内是描述符对象
writable: false, //只读模式,true写入模式
value: "Nicholas"
});
person.name = "zhangsan";
alert(person.name); //打印"Nicholas" 因为这边是只读模式
在调用Object.defineProperty()
时如果不指定configurable
,enumerable
,writable
,默认都是false
。
访问器属性
访问器属性不包含数据值,它们包含一对getter
和setter
函数。
getter
:读取访问器属性调用
setter
:写入访问器属性调用
4个特性:
[[Configurable]]
:表示能否通过delete
删除属性、能否修改属性的特性,能否把属性修改为访问器属性。默认true
。
[[Enumerable]
:表示能通过for-in
循环返回属性。默认true
。
[[getter]]
:读取访问器属性调用,默认undefined
。
[[setter]]
:写入访问器属性调用,默认undefined
。