面向对象的语言标志,就是他有一个类的概念,通过类可以创建多个具有相同属性的方法和对象。但是ECMAscript并没有类的概念,所以它的对象也与其他语言中的对象有所不同
ECMA把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数”
它基于引用类型,由引用类型创建出来。
创建对象可以通过new一个Object的实例出来,然后给他添加属性和方法
var obj=new Object();
obj.name="burning";
obj.age=29;
obj.sayName=function(){
alert(this.name);
}
obj.sayName()//burning
第二种方法就是对象字面量
var obj={
name:"burning",
age:29,
sayName:function(){
alert(this.name);
}
}
obj.sayName();//burning
在JavaScript中对象是一种基本的数据类型,在数据结构上是一种散列表,可以看作是属性的无序集合,除了原始值其他一切都是对象。可通过属性名访问这些值,而属性名可以是包含空字符在内的任意字符串。简单点说,一个对象就是一系列属性的集合,一个属性包含一个名字(key)和一个值(value)。
数据属性
ECMAscript中包含两种属性,数据属性和访问器属性,先谈谈数据属性
- [[Configurable]]:这个属性表示是否能够通过delete删除属性重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认值为true。
- [[Enumerable]]:这个属性表示是否能够通过for-in循环返回属性。默认值为true
- [[Writable]]:表示是否能够修改属性的值。默认值为true
- [[value]]:表示包含这个属性的数据值。读取数据的时候,从这个位置读;写入值的时候就是写入他的值,默认值为undefined。
若是要修改这些属性的值,需要使用到Object.defineProperty()方法,这个方法有三个参数:对象名,属性名,和描述符对象
var person={};
Object.defineProperty(person,"name",{writable:false,value:"ROTK"});
console.log(person.name);//ROTK
person.name="burning"
console.log(person.name);//ROTK
当我设置了writable的时候,他就无法修改person.name的值了
**第二个参数值记得要”“引起来
我们可以通过Object.defineProperties()
的方法定义多个属性
var book={}
Object.defineProperties(book,{
_year:{
value:2017
},
edition:{
value:1
},
year:{
get:function(){
return this._year
},
set:function(newValue){
if (newValue>2017) {
this._year=newValue;
this.edition+=newValue-2017;
};
}
}
})
访问器属性
- [[configurable]]:表示是否能通过delete删除属性而重新定义属性,能否修改属性的特性,或者能否吧属性修改为数据属性。默认值为true
- [[Enumerable]]:能否通过for-in循环返回属性。默认值为true
- [[get]]:在读取属性时调用的函数。默认值为true
- [[set]]:在写入属性时调用的函数,默认值为true
访问器属性类似于数据属性,必须使用Object.defineProperty()来定义。
var book={
_year:2017,//下划线表示只能通过对象方法访问的属性值,也就是私有变量
edition:2
}
Object.defineProperty(book,"year",{
get:function(){
return 0
},
set:function(newValue){
if (newValue>2017) {
this._year=newValue;
this.edition+=newValue-2017;
}
}
})
book.year=2020;
alert(book.edition);//5
在上面这个例子中,我修改了get属性的值,让他返回0,我们发现如果对book.year进行输出,他永远都是0,然后我修改了set属性的值,使得edition的值发生了改变。出现了即设置一个属性的值会导致其他的值发生变化。
读取属性的特性
ECMAscript5提供了Object.getOwnPropertyDescriptor()
方法来取得给定属性的描述符。这个方法接收两个参数:对象名和和要读取其描述符的属性名称
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