面向对象的程序设计

面向对象的程序设计,没有对象,面个毛

理解对象

ECMAScript中有两种属性:数据属性、访问器属性

  1. 数据属性:包含一个数据值的位置,在这个位置上可以读取和写入值,他有4个描述其行为的特性
    [[Configurable]]: 表示能否通过delete来删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问其属性,默认值为true;
    [[Enumerable]]:表示能否通过for-in循环返回属性,默认为true;
    [[Writable]]:表示能否修改属性的值,默认为true;
    [[Value]]:包含这个属性的数据值,读取属性值得时候,从这个位置读,写入属性值的时候,把新值保存在这个位置

要修改默认的特性,必须使用Object.defineProperty()
参数:属性所在的对象、属性的名字、一个描述符对象(其属性必须是:configurable,enumerable,writable,value,设置其中的一个或多个值);

1
2
3
4
5
6
7
8
var person = {};
Object.defineProperty(person,"name",{
writable:false, //设置为不能修改,只读
value:'bob'
});
alert(person.name); //bob
person.name = 'haha';
alert(person.name); //bob

一旦把属性定义为不可配置的,就不能再把它便会可配置了,此时再调用Object.defineProperty()修改除writable
之外的特性会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
var person = {};
Object.defineProperty(person,"name",{
configurable:false,
value:'bob'
});

//抛出错误
Object.defineProperty(person,'name',{
configurable:true,
value:'haha'
});

console.log(person.name) // Cannot redefine property: name

Object.defineProperty()如果不指定,configurable,enumerable,writable,value默认为false

  1. 访问器属性:不包含数据值,包含一对gettersetter函数,不能直接定义,要使用Object.defineProperty()来定义
    [[Configurable]]: 表示能否通过delete来删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问其属性,默认值为true;
    [[Enumerable]]:表示能否通过for-in循环返回属性,默认为true;
    [[Get]]: 在读取属性时调用的函数,默认为underfined
    [[Set]]: 在写入属性时调用的函数,默认为underfined;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var book = {
_year:2016,
edition:1
};
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue>2016){
this._year = newValue;
this.edition += newValue - 2016;
}
}
});

book.year = 2020;
alert(book.edition) //5

get/set:
说明了,就是我们可以限制一个变量是否可以被访问或是否可以被重写。
另外还有一个功能是,我们在访问或重写时可以执行其他语句进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
var age = 18;
var test = {
get age (){
return age;
},
set age (value){
if(value > 100) age= new Date().getFullYear() - value;
else age = value;
}
};

test.age = 1995; //set
console.log(test.age); //get ->21

Object.defineProperties()定义多个属性

读取属性的特性:
Object.getOwnPropertyDescriptor():
两个参数:
属性所在的对象以及要读取其描述符的属性名称

文章目录
  1. 1. 理解对象