在面向对象语言中都有类的概念,通过类来创建具有属性和方法的对象。而ECMAScript中没有类的概念,ECMAScript中定义了对象:无需属性的集合,其属性值可以包含基本值、对象、或者函数。
在Javascript中每个对象都是基础引用类型来创建的,可以是原生类型也可以是自定义的类型。
自定义对象最简单的方法就是通过创建Object类型的实例,然后为这个实例添加属性和方法。
var Person = new Object();
Person.name = "yangxunwu";
Person.age = 24;
Person.sayName = function(){
alert(this.name);
};
我们这里创建了一个object类型的一个名为Person的对象,有两个属性name和age,一个方法sayName;
属性类型:
对象拥有属性,这些属性也有一些特性,比如Configurable、Enumerable、Writable、Value。在javascript不能直接访问这些特性,需通过对象的方法访问,比如Object.defineProperty()
数据属性:数据属性包含这个数据值的位置,在这个位置可以读取和写入值。数据属性有四个特性:
Configurable:能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。
Enumerable:能否通过for-in循环返回属性。
Writable:能否修改属性值。
Value:保持这个属性的数据值。
var Person = {
name: "yangxunwu",
}
Object.defineProperty(Person, "age", {
writable: false,
value: 24
})
定义一个Person对象,并设置一个不可写的值为24的age属性。注意定义属性时的属性字符串形式。当把属性的configurable特性设置为false时,无法在次修改,只能使用writable。
访问器属性: 访问器属性不包含值,包含一对getter和setter函数,访问访问器属性时调用getter函数,这个函数返回有效的值,写入访问器属性时调用setter函数,并传入新值。访问器属性包含四个特性:
Configurable:能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为数据属性。
Enumerable:能否通过for-in循环返回属性。
Get:读取数据时调用的函数。默认undefined
Set:写入属性时调用的函数。默认undefined
var Person = {
_year : 1992,
age : 0
}
Object.defineProperty(Person, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 1992){
this._year = newValue;
this.age = newValue - 1992;
}
}
})
给Person对象,定义了一个访问器属性year,访问时返回对象的__year属性,赋值时会调用set函数,然后同时设置age的值。
部分浏览器也可以通过_defineGetter__和 __defineSetter__来设置访问器特性。也可以设置多个特性Object.defineProperties()。要读取一个属性的特性,可以通过给定属性的描述符。
Object.getOwnPropertyDescriptor()方法,返回一个对象,包含各种特性的属性,可以针对BOM和DOM对象来使用。
ECMAScript定义这些特性的目的是为了实现Javascript引擎用的