第六章 面向对象的编程
6.1 理解对象
创建对象方式
1. 创建 Object实例,并添加属性和方法:
var cat = new Object( ) ;
//var cat = { } ;
cat.name='果冻' ;
2. 对象字面量创建实例(常用):
var cat = {name : '果冻'};
属性类型
(内部采用的特性 / 属性的各种特征 / 实现JavaScript引擎 / 不能直接访问 /规范:例[[Enumerable]])
1. 数据属性
A.[[Configurable]] :默认值(true),判断是否能从对象中删除(delete)属性并重新定义;
B.[[Enumerable]]:默认值(true),判断是否能通过for-in返回对象属性;
C.[[Writable]]: 默认值(true),判断能否直接在对象上定义属性;
D.[[Value]]: 默认值(undefined),包含这个属性的数据值,用于数据的读取/写入。
属性默认特性修改方式:Object.defineProperty(),该方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。描述符(descriptor)对象的属性必须是:configurable、enumerable、writable和value。
var person = {};
Object.defineProperty(person, 'name', {
writable:false,
configurable:false,
value:'Nicholas'
});
console.log(person.name);//'Nicholas'
person.name = 'Greg';
console.log(person.name);//'Nicholas'
//调用Object.defineProperty()方法时,
//configurable、enumerable和writable特性默认值为false。
//该方法,多用于理解JavaScript对象。
2. 访问器属性
(不包含数值/ 属性的各种特征 / getter&setter (不必须)/ getter返回有效的值 /setter 决定如何处理数据)
A.[[Configurable]] :默认值(true),判断是否能从对象中删除(delete)属性并重新定义;
B.[[Enumerable]]:默认值(true),判断是否能通过for-in返回对象属性;
C.[[Get]]: 默认值(undefined),读取属性时调用的函数;
D.[[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;
console.log(book.edition); //2
创建了一个book对象,并定义了两个默认的属性:_year 和 edition。
_year 前的下划线,表示只能通过对象方法访问的属性。
year 访问器属性,包含setter和getter函数,getter函数返回_year的值,setter函数通过计算来确定正确的版本。
访问器属性常见的方法:设置一个属性的值导致其他属性发生变化。
定义多个属性
方法 : Object.defineProperties()
参数 : 第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象重要添加或修改的属性一一对应。
var book = {};
Object.defineProperties(book, {
_year:{
value:2004
},
edition:{
value:1
},
year:{
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
//与Object.defineProperty的区别是这里的属性都是同一时间创建的。
读取属性的特性
方法 : Object.getOwnPropertyDescriptor()
参数 : 属性所在的对象和要读取其描述符的属性名称。
返回值 :
a . 访问器属性:configurable 、enumerable 、get和set;
b . 数据属性: configurable、enumerable 、writable和value.
var book = {};
Object. defineProperties (book, {
_year:{
value:2004
},
edition:{
value:1
},
year:{
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
console.log(descriptor. value); //2004
console.log(descriptor. configurable); //false
console.log(typeof descriptor.get); //"undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor. value); //"undefined"
console.log(descriptor. configurable); //false
console.log(typeof descriptor.get); //"function"